Skip to content

v4.0.0

Choose a tag to compare

@transitrix transitrix released this 25 Aug 18:40
· 54 commits to main since this release
8d846a0

[4.0.0] — 2026-08-25

Bump category: MAJOR — categorised the PRs landed since #512's 3.7.0 tag per RELEASING.md's bump table; highest is the set of breaking changes already staged for this cut (FGA notation-key removal, .ttrs template_id/template_versionrecipe_id/recipe_version, underscore forbidden in an ID middle segment). Additive work in the same window (process_parent, DRIVER.falsifier / ASSESSMENT.geographic_scope, rules-in-force, ACT-021, and the documentation PRs) rides along. Migration recipe: migrations/3.1-to-4.0/ (Transforms A and B landed ahead of the cut per CONTRACT.md §10.6; Transform C is documented). node scripts/check-notations.mjs passes clean (two pre-existing SIZE1 warnings, non-blocking).

Added

  • rules-in-force — a report-config view over the codex zone (notations/views/reports/24-rules-in-force.md). Sibling of Compliance Impact and Coverage Metric: the same REQUIREMENT.derived_from join, reading the codex catalogue itself rather than the obligation × subject overlay. Onboarding skill gains a rules-in-force template. Purely additive — a repository with no such view validates as before. (#513)
  • ACT-021 (warning) — an Action Schedule scoped by view_config.scope.root_action names an ACTION that is not that root and not a parent-descendant of it. Descendants resolve only through ACTION.parent. The message names the ACTION id and the root_action; the ACTION is omitted from the render rather than dropped silently. Does not fire when root_action is absent. Does not make parent required on a true root (ACTION-003 unchanged). Numbered ACT-021 because ACT-004ACT-009 already name different checks. Worked fixture: examples/action/root-action-scope/. Additive — a scoped view whose listed or projected ACTIONs are all in the descendant tree validates as before. (#527)
  • process_parent — a first-class PROCESSPROCESS relation recording that the child is a phase of the parent (17-relations.md §3, vocabulary.yaml). Composition of behaviour, not sequence and not view membership. Optional goal / result on PROCESS (ELEMENT_PRIMITIVES.md §7.5). A process-blueprint column MAY name an admitted PROCESS-… (derived label, no restated name/goal/result) or keep a document-local STAGE-… sketch; STAGE is not registered. ASSERT-003 is unchanged: a phase goes in realised_via (or is subject when it owns the obligation). Compliance-lane and report-config join for PROCESS- columns is specified (13-process-blueprint.md §5.4, 21-compliance-impact.md, 22-coverage-metric.md). New codes REL-007/REL-008, BP-012/BP-013/BP-014. Worked example: examples/relations/process-parent/. Additive — existing STAGE- only blueprints validate unchanged. (#522)
  • DRIVER.falsifier and ASSESSMENT.geographic_scope — two optional fields on the motivation-layer primitives (ELEMENT_PRIMITIVES.md §7.1, §7.17). falsifier is prose recording the observation that would weaken or refute a driver as a standing force; whether it has fired stays a human judgement, not a stored boolean. geographic_scope is a list of country codes (ISO 3166-1 alpha-2 or eu, reusing the codex jurisdiction vocabulary, elements/14-codex.md §1.1) naming where a finding was observed — a region is an explicit list of the countries it comprises, a market is not modelled by this field at all, and the reserved value [global] states "everywhere" explicitly, distinct from omitting the field ("not stated"). New ASSESS-001 (error) validates the value grammar. Purely additive — both fields are optional, no existing field's semantics changed, and an existing DRIVER or ASSESSMENT file with neither field validates exactly as before. No backfill. (#514)
  • A decision guide for connecting two REQUIREMENT records (15-requirement.md §2.4.1) — a compact table distinguishing parent (inline, same-TYPE decomposition), depends_on (first-class REL, conditional dependency between peer obligations), and required_for (first-class REL, obligation-to-release scoping), each with a one-line use/avoid rule. Cross-linked from 17-relations.md §3, which now also states explicitly that parent is an inline alternative to the REL kinds it registers, not a gap in the enum. Documentation only — clarifies existing normative text; no new field, TYPE, or validator rule. (#518)
  • 15-requirement.md §2.4 states explicitly that parent MAY cross document-stage boundaries — the ISO/IEC/IEEE 29148 StRS → SyRS → SRS tiers recorded by level (§2.5). This was already the typical direction described in §2.5's ladder; the new "Stage-agnostic" point states it as the field's own rule rather than as an aside on a different field, and confirms parent is independently silent on the endpoints' admission_state. New worked example examples/requirement-parent/ — a three-tier parent chain (stakeholdersystemsoftware) grounding the schema example already shown in §2. Documentation only; no new field, TYPE, or validator rule. (#519)
  • guides/how-a-document-prints.md — page size is declared, never inherited, A4 (612 × 792 pt is US Letter and wrong; 595 × 842 pt is A4); portrait by default; a wide picture takes a landscape page; if it still does not fit, split the view in the model. DIRECTIVE_LANGUAGE.md §3.5 states which supplied pictures are legitimate (photograph, screenshot of third-party software, scan — a picture of model content is a view, never a pre-exported raster placed as a figure). Named gaps: print layout, landscape PDF, and embedded pictures are specified and not built. (#526)

Changed

  • BREAKING: the document-view source object is named recipe, not template/skeleton, across @transitrix/document-view-engine and @transitrix/document-renderer. One object previously carried four names (.ttrs "template", the view engine's "skeleton", template_id/template_version, parseSkeleton/parse-skeleton.mjs); it is now recipe everywhere in both packages — filenames, identifiers, comments, and package descriptions (parse-template.mjs/parse-skeleton.mjsparse-recipe.mjs, parseSkeletonparseRecipe). Decided 2026-08-23; what a recipe produces is a model-backed document, never live/living document. The directive language spec and site copy are unaffected — this change is scoped to the two packages and their tests. (#515)
  • BREAKING: .ttrs header fields template_id/template_version renamed to recipe_id/recipe_version. Required on every .ttrs file (document, kind, recipe_id, recipe_version, canon). Migration recipe: migrations/3.1-to-4.0/ Transform B. No adopter .ttrs file exists outside this repo's own test fixture, so the recipe carries nothing real to rewrite today — it ships anyway, per CONTRACT.md §10.6. (#515)
  • BREAKING: an ID middle segment may not contain _. Underscore is TYPE-only (PROCESS_BLUEPRINT, INTERNAL_STANDARD, BUSINESS_OBJECT). A middle segment is [A-Za-z0-9]+; a hyphen splits segments. LAW-PERSONAL_DATA-1 is invalid; write LAW-PERSONAL-DATA-1. Documented as Transform C of migrations/3.1-to-4.0/ — not auto-rewritten, because a blanket _- would also hit TYPE prefixes. (#523)
  • REQUIREMENT.derived_from origin guidance: Field artefacts are not valid origin ids for a canon obligation. Documentation only; REQ-003 unchanged. (#524)
  • A repository may hold both a project role and the central role (patterns/enterprise-adr-registry.md, patterns/network-catalogue.md). Dual-role is allowed; harvest/index vs central admission/promotion stay distinct. Documentation only. (#525)

Removed

  • BREAKING: the fga notation key is removed. *.fga.transitrix.yaml / notation: fga — the 3-layer Driver → Goal → Activity chain — is no longer a valid notation; author it as a dgca document with view_config.layers.changes: off (DGA mode) instead, per the 2026-06-23 FGA-into-DGCA merge decision (notations/README.md § Family selection). FGA was deprecated in 2.0.0 (2026-07-12); its own spec front matter named removed_in: "4.0.0" (CONTRACT.md §10.6's one-major window, satisfied as of 3.0.0). The spec file (notations/views/diagrams/03-fga.md) and its example stub (notations/examples/fga/) are deleted — preserved in git history only, not repackaged. Migration recipe: migrations/3.1-to-4.0/ Transform A. No adopter *.fga.transitrix.yaml file exists outside the migration recipe's own fixture, so the recipe carries nothing real to rewrite today. (#520)

Fixed

  • ASSERTION.realised_via no longer claims a process-blueprint stage as a resolvable target. 16-assertion.md §2.1, 21-compliance-impact.md, 22-coverage-metric.md, and 13-process-blueprint.md §5.4 listed a blueprint STAGE-… id as a realised_via / lane-join target; stages are document-local and ASSERT-004 cannot resolve them. The decided process-local idiom is STEP. View grouping by stages[] is unchanged. No schema, enum, TYPE, or validation-severity change. (#521)