v4.0.0
[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_version → recipe_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 sameREQUIREMENT.derived_fromjoin, reading the codex catalogue itself rather than the obligation × subject overlay. Onboarding skill gains arules-in-forcetemplate. Purely additive — a repository with no such view validates as before. (#513)ACT-021(warning) — an Action Schedule scoped byview_config.scope.root_actionnames an ACTION that is not that root and not aparent-descendant of it. Descendants resolve only throughACTION.parent. The message names the ACTION id and theroot_action; the ACTION is omitted from the render rather than dropped silently. Does not fire whenroot_actionis absent. Does not makeparentrequired on a true root (ACTION-003unchanged). NumberedACT-021becauseACT-004–ACT-009already 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-classPROCESS→PROCESSrelation 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. Optionalgoal/resultonPROCESS(ELEMENT_PRIMITIVES.md§7.5). A process-blueprint column MAY name an admittedPROCESS-…(derived label, no restatedname/goal/result) or keep a document-localSTAGE-…sketch;STAGEis not registered.ASSERT-003is unchanged: a phase goes inrealised_via(or issubjectwhen it owns the obligation). Compliance-lane and report-config join forPROCESS-columns is specified (13-process-blueprint.md§5.4,21-compliance-impact.md,22-coverage-metric.md). New codesREL-007/REL-008,BP-012/BP-013/BP-014. Worked example:examples/relations/process-parent/. Additive — existingSTAGE-only blueprints validate unchanged. (#522)DRIVER.falsifierandASSESSMENT.geographic_scope— two optional fields on the motivation-layer primitives (ELEMENT_PRIMITIVES.md§7.1, §7.17).falsifieris 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_scopeis a list of country codes (ISO 3166-1 alpha-2 oreu, 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"). NewASSESS-001(error) validates the value grammar. Purely additive — both fields are optional, no existing field's semantics changed, and an existingDRIVERorASSESSMENTfile with neither field validates exactly as before. No backfill. (#514)- A decision guide for connecting two
REQUIREMENTrecords (15-requirement.md§2.4.1) — a compact table distinguishingparent(inline, same-TYPE decomposition),depends_on(first-class REL, conditional dependency between peer obligations), andrequired_for(first-class REL, obligation-to-release scoping), each with a one-line use/avoid rule. Cross-linked from17-relations.md§3, which now also states explicitly thatparentis 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 thatparentMAY cross document-stage boundaries — the ISO/IEC/IEEE 29148 StRS → SyRS → SRS tiers recorded bylevel(§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 confirmsparentis independently silent on the endpoints'admission_state. New worked exampleexamples/requirement-parent/— a three-tierparentchain (stakeholder→system→software) 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 ptis US Letter and wrong;595 × 842 ptis 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 aview, never a pre-exported raster placed as afigure). 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, nottemplate/skeleton, across@transitrix/document-view-engineand@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 nowrecipeeverywhere in both packages — filenames, identifiers, comments, and package descriptions (parse-template.mjs/parse-skeleton.mjs→parse-recipe.mjs,parseSkeleton→parseRecipe). 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:
.ttrsheader fieldstemplate_id/template_versionrenamed torecipe_id/recipe_version. Required on every.ttrsfile (document,kind,recipe_id,recipe_version,canon). Migration recipe:migrations/3.1-to-4.0/Transform B. No adopter.ttrsfile 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-1is invalid; writeLAW-PERSONAL-DATA-1. Documented as Transform C ofmigrations/3.1-to-4.0/— not auto-rewritten, because a blanket_→-would also hit TYPE prefixes. (#523) REQUIREMENT.derived_fromorigin guidance: Field artefacts are not valid origin ids for a canon obligation. Documentation only;REQ-003unchanged. (#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
fganotation key is removed.*.fga.transitrix.yaml/notation: fga— the 3-layer Driver → Goal → Activity chain — is no longer a valid notation; author it as adgcadocument withview_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 in2.0.0(2026-07-12); its own spec front matter namedremoved_in: "4.0.0"(CONTRACT.md§10.6's one-major window, satisfied as of3.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.yamlfile exists outside the migration recipe's own fixture, so the recipe carries nothing real to rewrite today. (#520)
Fixed
ASSERTION.realised_viano longer claims a process-blueprint stage as a resolvable target.16-assertion.md§2.1,21-compliance-impact.md,22-coverage-metric.md, and13-process-blueprint.md§5.4 listed a blueprintSTAGE-…id as arealised_via/ lane-join target; stages are document-local andASSERT-004cannot resolve them. The decided process-local idiom isSTEP. View grouping bystages[]is unchanged. No schema, enum, TYPE, or validation-severity change. (#521)