Skip to content

v3.7.0

Choose a tag to compare

@transitrix transitrix released this 22 Aug 20:09
· 70 commits to main since this release

[3.7.0] — 2026-08-22

Bump category: MINOR — categorised the commits landed since #493's 3.6.0 tag per RELEASING.md's bump table; highest is a set of purely additive schema changes (new PRINCIPLE codex TYPE, new introduced_in relation kind, new CAT-001/CAT-002/ADMIT-009/ADMIT-010/ADMIT-011 validator codes). Two of the new codes (CAT-002, and BOBJ-D001's severity correction below) are error-severity, but CONTRACT §10.4's grandfather clause keeps a MINOR/PATCH release's new error rules from applying retroactively to already-admitted adopter canon, so neither forces a MAJOR bump. node scripts/check-notations.mjs passes clean (two pre-existing SIZE1 warnings, non-blocking).

Added

  • PRINCIPLE — a new codex TYPE for a rule the organisation holds over itself with no stated issuing authority or conformance test (notations/elements/14-codex.md §2, §2.1, §4.1). Required fields are statement (one normative sentence) and rationale; issuing_authority and effective_date are optional — where an artefact can state both an issuing authority and a conformance test, §2.1's discriminator classifies it as POLICY or INTERNAL_STANDARD instead. An optional established_by field cites the decision that established the principle, in the decision-log reference form already in use (method/07-decisions.md §2); its absence is a review finding (CODEX-006, info), not a validator error. REQUIREMENT.derived_from's permitted TYPEs widen to include PRINCIPLE (15-requirement.md §2, REQ-003), and so does TERM.derived_from's (ELEMENT_PRIMITIVES.md §7.30, TERM-002) — both restrictions are stated as the same rule for the same reason, so they widen together. Registered in IDS_AND_REFERENCES.md §3.5 and §4 (uniqueness scope: the organisation's codex/internal/ zone, resolved against the nearest enclosing transitrix.yaml, unchanged from POLICY/INTERNAL_STANDARD). The onboarding skill gains a templates/codex-principle.yaml scaffold; @transitrix/ingest-cli's codex-artefact / admit-source --zone codex commands accept --type PRINCIPLE with --statement/--rationale/--established-by. Purely additive: no existing field became required, no existing TYPE's shape changed, and a repository with no PRINCIPLE artefact validates exactly as it did before — no migration recipe needed. (#511)
  • A catalogue declares its own boundary — CAT-001/CAT-002. IDS_AND_REFERENCES.md §4's uniqueness scope now resolves against the nearest enclosing transitrix.yaml (MANIFEST.md §4) instead of an unstated tree-wide scope. CAT-001 (warning) flags a scanned tree with no manifest at its root; CAT-002 (error) flags a manifest nested inside another's subtree — grandfathered per CONTRACT §10.4, so only files authored against this release or later are checked against it. All twelve notations/examples/** catalogue roots now carry their own transitrix.yaml; two example trees that violated the no-nesting rule become siblings. (#509)
  • ADMIT-009 (warning) — extraction_confidence must not persist onto admitted canon. CONTRACT.md §11.1 states why the field is an ingest-candidate review flag that never reaches canon and never enters the §11.4 confidence formula; registered in vocabulary.yaml, cross-referenced from ELEMENT_PRIMITIVES.md §7.29. (#505)
  • A new optional example: true admission-record field — ADMIT-010/ADMIT-011. CONTRACT.md §6.4: absent means real; only true is a valid value (ADMIT-010); an example is excluded from every derived view/coverage total, and nothing without the field may reference something that has it (ADMIT-011, cross-cutting with ADMIT-005). New check-notations.mjs EX1 check keeps every notations/examples/** zone: canon fixture marked; all 75 such fixtures now carry the field. (#506)
  • A new introduced_in relation kind — closed-enum, INTEGRATION | APPLICATION -> RELEASE, M:N, time-aware (17-relations.md §3.3), registered in vocabulary.yaml. Separates the discrete per-release axis (which shipped state first carried a fact) from the continuous per-element valid_from axis; gives the derived what-shipped-in-release-R query as a predecessor walk. Endpoints stay narrow in v1 — TECHNOLOGY_SERVICE, NODE, CHANGE sources are a later widening, not a second kind. Also records the decision not to widen ASSERTION.subject to APPLICATION (16-assertion.md §2.4). (#495)

Changed

  • INFORMATION_ENTITY's alias window is now recorded as closed, matching what 1.0.0 announced. 1.0.0 declared the INFORMATION_ENTITYBUSINESS_OBJECT alias closed and old ids a hard error; the specs, the artefact, and the validator were never updated to agree, so at 3.6.0 ELEMENT_PRIMITIVES.md §7.15 and IDS_AND_REFERENCES.md §6 still promised an open one-release window with a BOBJ-D001 warning and a closure "in the following release". BOBJ-D001 is now error; the spec text says the window closed at 1.0.0; and the old name stays listed only so a tool that meets it can name the replacement instead of reporting an unknown TYPE. ACTIVITY and FACTOR carry the same 1.0.0-vs-reality gap and are deliberately left open — closing them reaches past this table (the activity_goal relation alias, the activity_type field, the activities/ path prefix) and is its own pass. (#504)
  • vocabulary.yaml's deprecated_element_types entries carry accepted (and retired_in when closed). A retired TYPE name previously had no way to say whether it was still admissible, so every consumer inferred warn-vs-reject for itself. accepted is required and validated; a closed entry must name the release that closed it. transitrix-ingest validate words its finding from that field — an open window reads [deprecation], a closed one [error] naming the release. (#504)
  • method/08-governance.md gains §2.1 — a human may ratify a bounded class of change in advance, not only a single instance. A standing grant names the exact change permitted, the conditions a guard must evaluate on every use, and an end condition; an agent acting inside it executes a decision rather than takes one, so the run is the record rather than a fresh decision entry. The unconditional guarantee is unchanged: every change in force was ratified by a human, an agent may never author/widen/ratify the grant it acts under, and a grant with no evaluating guard is not in force. (#502)

Fixed

  • The ingest and onboard extraction prompts told agents to emit INFORMATION_ENTITY. Both 03_application.md prompts (and their READMEs, the two SKILL.mds, templates/AGENTS.md, and the process-blueprint template's information_entities[] block) still named the TYPE retired by ADR 2026-06-08, so every application-layer extraction produced candidates that failed validate on the first pass and had to be renamed by hand. All now say BUSINESS_OBJECT / business_objects[]. ingest/SKILL.md's promotion rule additionally listed EQUIPMENT and INFORMATION_ENTITY as view-defined, which the same ADR reversed when it promoted both to standalone catalogued elements. (#503, #504)
  • ELEMENT_PRIMITIVES.md §7.29 described a RELEASE's valid_from as the admission-time record lifecycle; CONTRACT.md §7 already defined it as the modelled thing's own lifecycle — the ship date, not when the record was admitted. Three bundled examples had followed the wrong sentence and set valid_from from admitted_at (two others, already correct from released_at, are unchanged); the worked example is corrected so its three dates actually differ. Also records the provenance decision behind it: no schema extension for release provenance — derived_from already covers tag-sourced releases via the section 3 envelope every standalone TYPE carries. (#494)