Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 31 additions & 7 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,41 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Version

---

## [Unreleased]
## [7.0.0] — 2026-09-26

Bump category: **MAJOR**. ACTION numeric lower bounds now apply to 7.0.0
catalogues. Follow the [6.0 → 7.0 migration](migrations/6.0-to-7.0/);
values and historical diagnostics are never silently rewritten. Methodology,
CLI and editor packages keep independent release identities.

### Added

- Shared requirement-chain and release-report contracts, including evidence and
verification distinctions. (#617)
- Authored numeric risk degrees on an adopter-defined scale; existing qualitative
inputs remain valid. No calculator or universal scoring formula is required. (#625)
- Read-only document provenance checker and versioned result contract. (#621)
- Bounded requirement-language advisories and recurring activity guidance. (#622, #619)
- Examples for numerical risk scoring, shared business processes, actor boundaries,
legal identity and application hosting. (#609–#613)
- Desktop model setup, repository change-history and ADR applicability guides.
(#608, #614–#616, #623)

### Changed

- Define versioned diagnostic identities for canonical ACTIONs, schema shapes,
supported view forms and assertion-gap reports. Preserve schedule-view codes
and retired CODEX identities. The new ACTION numeric lower bounds target the
next major release, **7.0.0**, with a [compatibility and migration contract](migrations/6.0-to-7.0/);
current release pins are unchanged.
- Versioned ACTION/schema diagnostic identities preserve schedule codes and retired
CODEX meanings. Negative duration, duration_days, labor_cost, resources_cost,
effort and score are errors from 7.0.0; zero remains valid. (#618)
- Clarify frequent repository releases, empty-zone placeholders, pagination
reference boundaries and recurring activities. (#605–#607, #620)
- Manifest pins and ingest coverage presets consistently target 7.0.0.

### Fixed

- The 1.0→2.0 migration postcheck accepts preserved inline goals/actions without
forcing optional promotion; Python 3 with PyYAML is required for that check. (#624)

## [6.0.0] — Unreleased
## [6.0.0] — 2026-09-18

Bump category: **MAJOR**. Knowledge supersession now enforces errors on admitted
objects that the 5.1.0 linter accepted, including the published `KS-019`
Expand Down
2 changes: 1 addition & 1 deletion method/06-team-operations.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ Deliberately **not** one-file-per-record like ADR/WI: the journal is a single fi
---
### FB-0002
type: notation-gap
methodology_version: "6.0.0"
methodology_version: "7.0.0"
raised_by: modeler
date: "2026-07-27"
status: sent-upstream
Expand Down
28 changes: 26 additions & 2 deletions migrations/6.0-to-7.0/README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
# Diagnostic compatibility — methodology 6.0 → 7.0

This migration contract is for catalogue maintainers and validator implementers.
The target **7.0.0** is unreleased; this document does not change the current
release or any manifest pin. It defines the next-major boundary for the ACTION
The target **7.0.0** introduces the release boundary. It defines the next-major boundary for the ACTION
numeric restrictions in [24-action.md](../../notations/elements/24-action.md)
§6–6.1. Adding diagnostic identities for already-invalid structures does not
itself change their validity. Rejecting previously accepted numbers does.
Expand Down Expand Up @@ -135,3 +134,28 @@ they are not claims about a subsequently published or installed validator.

These gaps require validator follow-through. The contract and examples do not
claim runtime conformance, and a source merge alone does not close the gaps.


## Executable migration

Node.js 20+ is required. The read-only postcheck additionally uses Python 3 with
PyYAML, as does the repository linter. The codemod changes only the root manifest
pin from 6.0.0 to 7.0.0, preserving comments, newlines and all model bytes. It does
not correct numbers or rewrite diagnostic history. Review the six fields above
before applying the pin; if the postcheck reports a negative value, the author
must correct it or defer the upgrade. A pin change alone is not model acceptance.

```sh
node migrations/6.0-to-7.0/codemod.mjs --dry-run /path/to/model
node migrations/6.0-to-7.0/codemod.mjs /path/to/model
node migrations/6.0-to-7.0/validate.mjs /path/to/model
```

The postcheck reads YAML in declared canon/field/codex zones and an existing
root views directory. It checks canonical ACTIONs and inline action collections
in action and DGCA-family views; malformed YAML and symlinks cannot pass silently.
It is a numeric migration check, not complete schema, relation, admission or
rendering validation. Historical copies within those roots are reported for
review, never altered. Exit 1 reports model findings; exit 2 reports invocation,
manifest or scan failures. Re-run the full validators against the release's tool
versions before admitting the upgrade.
91 changes: 91 additions & 0 deletions migrations/6.0-to-7.0/check-action-numbers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
#!/usr/bin/env python3
"""Read-only ACTION numeric boundary check for migration operators (Python + PyYAML)."""
import math
from pathlib import Path
import sys
try:
import yaml
except ImportError:
print("Python 3 with PyYAML is required", file=sys.stderr)
sys.exit(2)

FIELDS = ('duration', 'duration_days', 'labor_cost', 'resources_cost', 'effort', 'score')
class Loader(yaml.SafeLoader):
pass

def mapping(loader, node, deep=False):
seen = set()
for key_node, _ in node.value:
if key_node.tag == 'tag:yaml.org,2002:merge':
continue
key = loader.construct_object(key_node, deep=deep)
if key in seen:
raise ValueError('duplicate YAML key: ' + str(key))
seen.add(key)
loader.flatten_mapping(node)
return yaml.SafeLoader.construct_mapping(loader, node, deep=deep)
Loader.add_constructor(yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, mapping)

def main():
root = Path(sys.argv[1]).resolve()
manifest = yaml.load((root / 'transitrix.yaml').read_text(), Loader=Loader)
if not isinstance(manifest, dict) or manifest.get('methodology_version') != '7.0.0':
raise ValueError('expected methodology_version: "7.0.0"; run the documented pin migration first')
zones = manifest.get('zones')
if not isinstance(zones, list) or not zones or any(z not in ('canon', 'field', 'codex') for z in zones):
raise ValueError('manifest zones must be a nonempty list of canon/field/codex')
errors, files, actions = [], 0, 0
roots = [root / z for z in dict.fromkeys(zones)]
if (root / 'views').exists():
roots.append(root / 'views')
def check(record, label):
nonlocal actions
actions += 1
if not isinstance(record, dict):
errors.append(label + ': ACTION must be a mapping'); return
for field in FIELDS:
if field not in record:
continue
value = record[field]
if value is None and field in ('duration', 'duration_days'):
continue
if type(value) not in (int, float) or not math.isfinite(value) or (field == 'score' and value != int(value)):
errors.append(label + '.' + field + ': SCHEMA_INVALID numeric type')
elif value < 0:
errors.append(label + '.' + field + ': ACTION-011 negative value; author correction required')
for zone in roots:
if not zone.is_dir() or zone.is_symlink():
raise ValueError('missing or symlinked scan root: ' + str(zone))
for path in sorted(zone.rglob('*')):
if path.is_symlink():
raise ValueError('symlink requires explicit review: ' + str(path))
if not path.is_file() or path.suffix.lower() not in ('.yaml', '.yml'):
continue
files += 1
label = str(path.relative_to(root))
try:
doc = yaml.load(path.read_text(), Loader=Loader)
if not isinstance(doc, dict):
raise ValueError('expected YAML mapping')
notation = doc.get('notation')
if notation in ('action', 'activity') and str(doc.get('id', '')).startswith(('ACTION-', 'ACTIVITY-')):
check(doc, label)
if notation in ('action', 'activities', 'dgca', 'dga', 'fgca', 'fga', 'actions-tree'):
for key in ('actions', 'activities'):
if key in doc:
if not isinstance(doc[key], list):
errors.append(label + '.' + key + ': expected array')
else:
for i, action in enumerate(doc[key]):
check(action, label + '.' + key + '[' + str(i) + ']')
except (ValueError, yaml.YAMLError, OSError) as error:
errors.append(label + ': ' + str(error))
for error in errors:
print(error, file=sys.stderr)
print(f'{files} YAML files read; {actions} ACTION records checked; {len(errors)} errors.')
print('Numeric migration checks only. Run the owning notation and whole-model validators; retain historical diagnostics.')
return 1 if errors else 0
try:
sys.exit(main())
except (OSError, ValueError, yaml.YAMLError) as error:
print(str(error), file=sys.stderr); sys.exit(2)
29 changes: 29 additions & 0 deletions migrations/6.0-to-7.0/codemod.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#!/usr/bin/env node
// Only the manifest pin is mechanical. ACTION values and diagnostic history are never rewritten.
import { readFileSync, writeFileSync } from 'node:fs';
import { join, resolve } from 'node:path';

const args = process.argv.slice(2);
if (args.some(a => a.startsWith('--') && a !== '--dry-run') || args.filter(a => !a.startsWith('--')).length > 1) {
console.error('Usage: node codemod.mjs [--dry-run] [target-dir]');
process.exit(2);
}
try {
const file = join(resolve(args.find(a => !a.startsWith('--')) ?? '.'), 'transitrix.yaml');
const text = readFileSync(file, 'utf8');
const lines = text.match(/^methodology_version:.*$/gm) ?? [];
const pin = /^methodology_version: (["']?)(6\.0\.0|7\.0\.0)\1([ \t]*(?:#.*)?)(\r?)$/;
if (lines.length !== 1 || !pin.test(lines[0])) {
console.error('Manual intervention: expected one top-level 6.0.0 or 7.0.0 methodology_version pin.');
process.exit(1);
}
const next = text.replace(/^methodology_version:.*$/m, line => line.replace(pin, (_, quote, version, comment, cr) => `methodology_version: ${quote}7.0.0${quote}${comment}${cr}`));
const changed = next !== text;
if (changed && !args.includes('--dry-run')) writeFileSync(file, next);
if (changed) console.log('transitrix.yaml: methodology_version 6.0.0 -> 7.0.0 (1 field)');
console.log(`1 file scanned; ${changed ? 1 : 0} file${changed ? '' : 's'} ${args.includes('--dry-run') ? 'would change' : 'changed'}.`);
console.log('Pin update only: complete the manual compatibility review and run validate.mjs.');
} catch (error) {
console.error(error.message);
process.exit(2);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
notation: action
id: ACTION-EXAMPLE-1
name: Preserve authored numeric values
duration: 0.5
score: 0
4 changes: 4 additions & 0 deletions migrations/6.0-to-7.0/fixtures/after/transitrix.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
transitrix: 1
methodology_version: "7.0.0"
zones: [canon]
notations: [action]
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
notation: action
id: ACTION-EXAMPLE-1
name: Preserve authored numeric values
duration: 0.5
score: 0
4 changes: 4 additions & 0 deletions migrations/6.0-to-7.0/fixtures/before/transitrix.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
transitrix: 1
methodology_version: "6.0.0"
zones: [canon]
notations: [action]
11 changes: 11 additions & 0 deletions migrations/6.0-to-7.0/validate.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#!/usr/bin/env node
// Read-only, release-specific numeric preflight; not whole-model certification.
import { spawnSync } from 'node:child_process';
import { fileURLToPath } from 'node:url';
const args = process.argv.slice(2);
if (args.length > 1 || args.some(a => a.startsWith('--'))) {
console.error('Usage: node validate.mjs [target-dir]'); process.exit(2);
}
const result = spawnSync('python3', [fileURLToPath(new URL('./check-action-numbers.py', import.meta.url)), args[0] ?? '.'], { stdio: 'inherit' });
if (result.error || result.signal) { console.error(result.error?.message ?? result.signal); process.exit(2); }
process.exit(result.status ?? 2);
4 changes: 2 additions & 2 deletions notations/CONTRACT.md
Original file line number Diff line number Diff line change
Expand Up @@ -982,7 +982,7 @@ Structural layout of a view document:
```yaml
notation: dgca # §1 — required header
spec_version: "0.1" # §1 — optional header
methodology_version: "6.0.0" # manifest-pinned methodology version
methodology_version: "7.0.0" # manifest-pinned methodology version
name: "Retail strategy chain" # §1.1 — required document name

view: # view identity block — id only; name lives at root per §1.1
Expand Down Expand Up @@ -1081,7 +1081,7 @@ views/
```yaml
view_id: DGCA-RETAIL-1 # canonical ID of the view being captured
generated_at: "2026-06-20T14:30:00Z" # ISO-8601 UTC timestamp — matches the file name
methodology_version: "6.0.0" # methodology version in use at generation time
methodology_version: "7.0.0" # methodology version in use at generation time
# …notation-specific element list follows (format defined per notation spec)…
```

Expand Down
4 changes: 2 additions & 2 deletions notations/COVERAGE_PROFILES.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ A profile is declared at the repository root in `transitrix.yaml` under the `cov

```yaml
transitrix: 1
methodology_version: "6.0.0"
methodology_version: "7.0.0"
notations: [dgca, goals, activities, capability-map]
zones: [canon, field]
coverage_profile: core # short form — name a shipped preset
Expand Down Expand Up @@ -250,7 +250,7 @@ The shipped presets (`minimal`, `core`, `full`) are *re-defined per methodology
```yaml
# transitrix.yaml
transitrix: 1
methodology_version: "6.0.0"
methodology_version: "7.0.0"
notations: [dgca, goals, activities, capability-map, applications]
zones: [canon, field]
# coverage_profile omitted → defaults to `full`
Expand Down
2 changes: 1 addition & 1 deletion notations/CURRENT_VERSION.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@
# placeholder allowlist in scripts/check-notations.mjs. Enforced by that
# script's V1 check. See notations/CONTRACT.md §10 for the versioning and
# compatibility policy this pin follows.
methodology_version: "6.0.0"
methodology_version: "7.0.0"
2 changes: 1 addition & 1 deletion notations/MANIFEST.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ A worked example lives at `transitrix.yaml` in the [acme-corp reference repo](ht

```yaml
transitrix: 1 # manifest schema version (integer)
methodology_version: "6.0.0" # the methodology release this repo conforms to
methodology_version: "7.0.0" # the methodology release this repo conforms to
notations: [dgca, goals, action, capability-map, codex]
zones: [canon, field, codex]
coverage_profile: full # optional — see COVERAGE_PROFILES.md
Expand Down
2 changes: 1 addition & 1 deletion notations/PACKAGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ A package is declared at the repository root in `transitrix.yaml` under the `pac

```yaml
transitrix: 1
methodology_version: "6.0.0"
methodology_version: "7.0.0"
notations: [dgca, goals, activities, capability-map]
zones: [canon, field]
coverage_profile: core
Expand Down
4 changes: 2 additions & 2 deletions notations/elements/14-codex.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
---
title: "Codex — external & internal authority artefacts"
version: "0.4"
version: "0.5"
author: "Valerii Korobeinikov"
last_updated: "2026-08-27"
last_updated: "2026-09-26"
status: "draft"
---

Expand Down
4 changes: 2 additions & 2 deletions notations/elements/25-nodes.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
---
title: "Nodes — infrastructure node primitive"
version: "0.1"
version: "0.2"
author: "Valerii Korobeinikov"
last_updated: "2026-06-28"
last_updated: "2026-09-26"
status: "draft"
---

Expand Down
4 changes: 2 additions & 2 deletions notations/elements/26-technology-services.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
---
title: "Technology Services — platform-level service primitive"
version: "0.1"
version: "0.2"
author: "Valerii Korobeinikov"
last_updated: "2026-06-28"
last_updated: "2026-09-26"
status: "draft"
---

Expand Down
4 changes: 2 additions & 2 deletions notations/elements/27-verification.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
---
title: "Verification — REQUIREMENT verification claim"
version: "0.5"
version: "0.6"
author: "Valerii Korobeinikov"
last_updated: "2026-09-24"
last_updated: "2026-09-26"
status: "draft"
---

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
notation: action
spec_version: "0.1"
methodology_version: "6.0.0"
methodology_version: "7.0.0"
id: ACTION_SCHED-LAUNCH-1
name: "Launch — scoped by root_action"
generated_at: "2026-08-25"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Its own catalogue root (MANIFEST.md §4): declares the boundary the
# uniqueness scope in IDS_AND_REFERENCES.md §4 resolves against.
transitrix: 1
methodology_version: "6.0.0"
methodology_version: "7.0.0"
notations: [action]
zones: [canon]
coverage_profile: core
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
notation: action
spec_version: "0.1"
methodology_version: "6.0.0"
methodology_version: "7.0.0"
id: ACTION_SCHED-LAUNCH-UNSCOPED-1
name: "Launch — no root_action"
generated_at: "2026-08-25"
Expand Down
2 changes: 1 addition & 1 deletion notations/examples/actor-boundaries/transitrix.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Synthetic catalogue; see README.md.
transitrix: 1
methodology_version: "6.0.0"
methodology_version: "7.0.0"
notations: [actor]
zones: [canon]
coverage_profile: core
2 changes: 1 addition & 1 deletion notations/examples/actor-legal-identity/transitrix.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Synthetic catalogue; see README.md.
transitrix: 1
methodology_version: "6.0.0"
methodology_version: "7.0.0"
notations: [actor]
zones: [canon]
coverage_profile: core
Loading
Loading