v3.7.0
[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 arestatement(one normative sentence) andrationale;issuing_authorityandeffective_dateare optional — where an artefact can state both an issuing authority and a conformance test, §2.1's discriminator classifies it asPOLICYorINTERNAL_STANDARDinstead. An optionalestablished_byfield 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 includePRINCIPLE(15-requirement.md§2,REQ-003), and so doesTERM.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 inIDS_AND_REFERENCES.md§3.5 and §4 (uniqueness scope: the organisation'scodex/internal/zone, resolved against the nearest enclosingtransitrix.yaml, unchanged fromPOLICY/INTERNAL_STANDARD). The onboarding skill gains atemplates/codex-principle.yamlscaffold;@transitrix/ingest-cli'scodex-artefact/admit-source --zone codexcommands accept--type PRINCIPLEwith--statement/--rationale/--established-by. Purely additive: no existing field became required, no existing TYPE's shape changed, and a repository with noPRINCIPLEartefact 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 enclosingtransitrix.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 twelvenotations/examples/**catalogue roots now carry their owntransitrix.yaml; two example trees that violated the no-nesting rule become siblings. (#509) ADMIT-009(warning) —extraction_confidencemust 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 invocabulary.yaml, cross-referenced fromELEMENT_PRIMITIVES.md§7.29. (#505)- A new optional
example: trueadmission-record field —ADMIT-010/ADMIT-011.CONTRACT.md§6.4: absent means real; onlytrueis 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 withADMIT-005). Newcheck-notations.mjsEX1check keeps everynotations/examples/**zone: canonfixture marked; all 75 such fixtures now carry the field. (#506) - A new
introduced_inrelation kind — closed-enum,INTEGRATION | APPLICATION -> RELEASE, M:N, time-aware (17-relations.md§3.3), registered invocabulary.yaml. Separates the discrete per-release axis (which shipped state first carried a fact) from the continuous per-elementvalid_fromaxis; gives the derived what-shipped-in-release-R query as a predecessor walk. Endpoints stay narrow in v1 —TECHNOLOGY_SERVICE,NODE,CHANGEsources are a later widening, not a second kind. Also records the decision not to widenASSERTION.subjecttoAPPLICATION(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 theINFORMATION_ENTITY→BUSINESS_OBJECTalias closed and old ids a hard error; the specs, the artefact, and the validator were never updated to agree, so at 3.6.0ELEMENT_PRIMITIVES.md§7.15 andIDS_AND_REFERENCES.md§6 still promised an open one-release window with aBOBJ-D001warning and a closure "in the following release".BOBJ-D001is nowerror; 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.ACTIVITYandFACTORcarry the same 1.0.0-vs-reality gap and are deliberately left open — closing them reaches past this table (theactivity_goalrelation alias, theactivity_typefield, theactivities/path prefix) and is its own pass. (#504)vocabulary.yaml'sdeprecated_element_typesentries carryaccepted(andretired_inwhen 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.acceptedis required and validated; a closed entry must name the release that closed it.transitrix-ingest validatewords its finding from that field — an open window reads[deprecation], a closed one[error]naming the release. (#504)method/08-governance.mdgains §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. Both03_application.mdprompts (and their READMEs, the twoSKILL.mds,templates/AGENTS.md, and the process-blueprint template'sinformation_entities[]block) still named the TYPE retired by ADR 2026-06-08, so every application-layer extraction produced candidates that failedvalidateon the first pass and had to be renamed by hand. All now sayBUSINESS_OBJECT/business_objects[].ingest/SKILL.md's promotion rule additionally listedEQUIPMENTandINFORMATION_ENTITYasview-defined, which the same ADR reversed when it promoted both to standalone catalogued elements. (#503, #504) ELEMENT_PRIMITIVES.md§7.29 described aRELEASE'svalid_fromas 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 setvalid_fromfromadmitted_at(two others, already correct fromreleased_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_fromalready covers tag-sourced releases via the section 3 envelope every standalone TYPE carries. (#494)