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
65 changes: 65 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,71 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Version

## [Unreleased]

## [6.0.0] — Unreleased

Bump category: **MAJOR**. Knowledge supersession now enforces errors on admitted
objects that the 5.1.0 linter accepted, including the published `KS-019`
warning-to-error change. Follow the [5.1 → 6.0 migration recipe](migrations/5.1-to-6.0/)
before upgrading. The manifest and ingest coverage presets both target 6.0.0;
package versions retain their independent versioning.

### Added

- Repository MCP pattern and enterprise setup guidance, including responsibilities
for catalogue hosts and consumers. (#587, #603)
- Catalogue-release and vocabulary CI examples, plus ingest guidance for
recognition, promotion, and review of returned bindings. (#592, #594)
- HTML glossary reports derived from admitted canon through the document-view
engine's `view` directive. (#593)
- Cold-read adoption review procedure and expanded knowledge freshness tests. (#588, #595)

### Changed

- **Breaking: knowledge supersession validation.** `KS-018` checks both pointers
for a unique admitted target; `KS-019` requires reciprocal admitted pointers;
`KS-020` rejects mismatches, self-links and cycles. A draft proposing
`supersedes` still receives only a missing-backlink warning. Linear chains
may grow beyond two objects. Re-curation preserves original assertions and
sources, admits a successor, and updates only predecessor lifecycle metadata.
The knowledge-store skill minimum version is 6.0.0. (#589, #597)
- **Extraction compatibility:** unsupported top-level extraction fields now fail
explicitly instead of disappearing; schema-undefined data belongs in
`extensions`. Corroboration preserves existing values while filling missing
fields and adding provenance. Review custom extraction producers before
upgrading. (#602)
- Validator coverage contract requires exhaustive file accounting, visible
unvalidated paths and warnings, and `NOTATION-SKIP-001` promotion under
`--strict`. Action scheduling advisories are documented at warning severity.
Downstream tool conformance must be checked separately. (#599)
- Compaction guidance requires demonstrated reachability and preservation;
base/open-tier stores defer removal. No compaction algorithm ships. (#598)
- Issued-document preservation and assembly-history guidance: each release records
its full environment, earlier assembly facts remain available, and RELEASE
subjects remain PRODUCT or APPLICATION. No new release-state schema is added. (#600)

### Fixed

- Candidate TYPE fields survive extraction and review without importing source
claims of admission authority. (#602)
- The first Goals-tree session and one-command L0 adoption instructions are
shorter and directly executable. (#590, #591)
- Plugin example dependency `js-yaml` updates from 4.3.1 to 4.3.2. (#596)
- Knowledge-store rule tables now match enforced supersession severity and scope.

### Removed

- Obsolete documentation audit report. (#586)

### Upgrade compatibility

Stores without supersession pointers need no knowledge-object rewrite. Repair
existing links through review; never auto-create a relationship or mutate an
admitted assertion to satisfy validation. Refresh the knowledge-store linter
and skill alongside the manifest, specs, and ingest CLI. `tools/lint.py` is
unchanged. Coverage preset element and relation lists are unchanged. Independent
notation revisions updated for this span are Action 2.3, Relations 0.4 and
Glossary 0.2; other notation edits only refresh example methodology pins.

## [5.1.0] — 2026-09-04

Bump category: **MINOR** — highest change since the 5.0.0 pin is additive: the `documents` package, knowledge-object supersession fields and freshness warnings, the issue-tracker binding guide, and document-renderer paged-media / landscape / caption work. No migration recipe: a repository that never declares `packages: [documents]` and never uses the new knowledge-store fields validates as it did on 5.0.0. New `error` codes (`DOCS-001..007`, `KS-018`, `KS-020`) fire only when those optional surfaces are in use.
Expand Down
2 changes: 1 addition & 1 deletion integration/test_catalogue_workflows.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ def test_publication_rejects_mismatch_extra_fields_duplicates_and_lossy_yaml(sel

def test_ci_reports_both_findings_without_editing_canon_and_fails_on_broken_pin(self):
manifest = self.root / 'transitrix.yaml'
manifest.write_text('methodology_version: "5.1.0"\n')
manifest.write_text('methodology_version: "6.0.0"\n')
result = self.run_step('ci-example.yaml', 'vocabulary', 'Report collisions and unbound matches')
self.assertEqual((result.returncode, result.stdout), (0, ''))
(self.root / 'vendor').mkdir()
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: "5.1.0"
methodology_version: "6.0.0"
raised_by: modeler
date: "2026-07-27"
status: sent-upstream
Expand Down
101 changes: 101 additions & 0 deletions migrations/5.1-to-6.0/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# Migration recipe — methodology 5.1 → 6.0

Version 6.0.0 preserves knowledge supersession history and enforces reciprocal
links. The v5.1.0 rule table described `KS-019` as a warning; it is now an error
for admitted objects. `KS-018` and `KS-020` also enforce target resolution and
graph integrity. A store that passed the old linter can fail the new one.
Stores without supersession fields need no knowledge-object edits.

| Old form or behaviour | 6.0.0 requirement |
|---|---|
| Admitted successor names a predecessor without a backlink | Both admitted objects name each other; `KS-019` is an error |
| Malformed, missing, ambiguous, or draft target | Each pointer is one non-empty string resolving to one admitted knowledge object (`KS-018`) |
| Mismatched reverse pointer, self-link, or cycle | Repair the reviewed linear history (`KS-020`); chains of any length are allowed |
| Draft proposes a successor | Missing predecessor backlink remains a `KS-019` warning; do not mutate the predecessor before approval |
| Extraction carries unsupported top-level fields | Put schema-undefined data under `extensions`; supported TYPE fields stay at their defined locations |
| A later extraction overwrites an existing candidate value | Corroboration preserves existing values, fills absent fields, and adds provenance |

## Manual steps

1. Preserve the current revision and review the upgrade in a separate change.
Run the **6.0.0** `tools/knowledge_store_lint.py` against the adopter root.
Resolve `KS-018`/`KS-020` findings from evidence; do not infer a relationship
from filenames or rewrite an assertion to make the linter pass.
2. For an already approved successor, add the missing reciprocal lifecycle
pointer and advance the predecessor's `timestamp` to the repair time. For example:

```diff
# knowledge/old.md (predecessor)
-timestamp: 2026-09-01T10:00:00Z
+timestamp: 2026-09-18T10:00:00Z
+superseded_by: /knowledge/new.md
# knowledge/new.md already contains:
supersedes: /knowledge/old.md
```

Preserve the predecessor's body, `source`, `description`, `confidence`,
`created_at`, and any existing `supersedes`. Retain both objects, original
sources and hashes, index rows, and a dated admission/repair log. A draft
stays under review until the successor and backlink can be admitted together.
This requires curator review; the codemod deliberately cannot do it.
3. Review extraction producers against the supported fields in
[`emit-candidates.mjs`](../../packages/ingest-cli/src/emit-candidates.mjs).
For example, replace top-level `custom_score: 7` with
`extensions: {custom_score: 7}` when that field is not in the schema.
Re-extract previously dropped TYPE fields from preserved sources, then review
them; do not overwrite reviewed candidates merely to refresh confidence.
4. Review assembly history against
[`17-relations.md`](../../notations/elements/17-relations.md).
Each release records its complete `assembled_on` environment, including
unchanged systems. A successor does not end its predecessor's historical
links. Correct a `valid_to` set solely for succession only after reviewing
the original evidence. `RELEASE` subjects are `PRODUCT` or `APPLICATION`;
the former `TECHNOLOGY_SERVICE` wording did not override that restriction.
5. Set `methodology_version` in `transitrix.yaml` from `5.1.0` to `6.0.0`,
manually or with the codemod below. Reinstall the ingest CLI from the new
checkout, refresh adopted specs and skills, and refresh the knowledge-store
linter if vendored. The knowledge-store skill now has `min_version: "6.0.0"`;
update the corresponding skill-table entry. `tools/lint.py` itself did not
change in this release. Follow the four-artefact procedure in
[`RELEASING.md`](../../RELEASING.md#adopter-upgrade-procedure).
6. Run the post-check below, normal canon validation and `repo-check`. Review
warnings explicitly. Validator implementers must also check CONTRACT §18's
exhaustive coverage accounting and `NOTATION-SKIP-001` strict promotion;
the specification does not certify every downstream validator's support.

Compaction remains a decision frame, with no deletion tool. Retain knowledge
objects until mechanical reachability and preservation can be demonstrated;
base/open-tier stores cannot establish the required canon binding and must
defer removal. See [the pattern](../../patterns/knowledge-store.md).

## Commands and boundaries

Use Node.js ≥20 for the pin-only, dependency-free codemod. The post-check also
requires `python3` and PyYAML, as does the reference knowledge-store linter.
Run these commands from the 6.0.0 methodology checkout:

```bash
node migrations/5.1-to-6.0/codemod.mjs --dry-run <adopter-root>
node migrations/5.1-to-6.0/codemod.mjs <adopter-root>
node migrations/5.1-to-6.0/validate.mjs <adopter-root>
```

The codemod changes only one unambiguous top-level manifest pin and preserves
other text, comments, quoting and line endings. Rerunning is a no-op. It exits
`1` for an unsupported/ambiguous pin, `2` for an I/O or invocation error, and
`0` on success; `--dry-run` writes nothing. Its success is not evidence that
manual compatibility work is complete. Upgrade older versions through their
intervening recipes first. For a knowledge-only store without a manifest, use
the manual steps and run `python3 tools/knowledge_store_lint.py <store-root>`
directly rather than adding a manifest solely for this wrapper.

`validate.mjs` checks the target pin and invokes the same reference linter used
by the skill. It exits `0` with no errors, `1` for validation findings, or `2`
for invocation/I/O errors. It never applies the codemod. It cannot verify
historical preservation, human approval, extraction producers, or downstream
validator implementations; those remain the manual review above.

`fixtures/before/` and `fixtures/after/` demonstrate the automated pin change
on an already valid reciprocal history. The test also removes a backlink to
prove the post-check rejects incomplete admission; it verifies dry-run,
idempotence, and byte preservation of the knowledge objects.
29 changes: 29 additions & 0 deletions migrations/5.1-to-6.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. Knowledge relationships require review.
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: (["']?)(5\.1\.0|6\.0\.0)\1([ \t]*(?:#.*)?)(\r?)$/;
if (lines.length !== 1 || !pin.test(lines[0])) {
console.error('Manual intervention: expected one top-level 5.1.0 or 6.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}6.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 5.1.0 -> 6.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,16 @@
---
type: source-document
title: "CFO onboarding interview"
description: "First-hand account of the order-fulfilment pain points from the CFO."
source: "_intake/originals/2026-07-01-cfo-interview.md"
source_hash: "sha256:0000000000000000000000000000000000000000000000000000000000000001"
created_at: 2026-07-01
confidence: observed
tags: [interview, fulfilment]
tracks: [okf]
status: processed
---

# Summary

The CFO described manual hand-offs between warehouse and finance as the primary bottleneck.
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
type: insight
title: "Order fulfilment bottleneck"
description: "Manual hand-offs between warehouse and finance slow order fulfilment."
source: _intake/processed/2026-07-01-cfo-interview.md
created_at: 2026-07-01
confidence: inferred
tags: [fulfilment, operations]
superseded_by: /knowledge/warehouse-finance-handoff.md
timestamp: 2026-07-01T10:00:00Z
---

# Body

Warehouse picks are complete before finance receives the invoice trigger, creating a multi-day lag.

# Citations

- CFO onboarding interview (`_intake/processed/2026-07-01-cfo-interview.md`)
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
type: finding
title: "Warehouse-finance handoff delay"
description: "Finance invoice trigger arrives days after warehouse completion."
source: _intake/processed/2026-07-01-cfo-interview.md
created_at: 2026-07-01
confidence: observed
tags: [finance, warehouse]
supersedes: /knowledge/order-fulfilment-bottleneck.md
timestamp: 2026-07-01T10:30:00Z
---

# Body

The hand-off relies on a spreadsheet emailed twice weekly; no system integration exists.

# Citations

- [Order fulfilment bottleneck](/knowledge/order-fulfilment-bottleneck.md)
2 changes: 2 additions & 0 deletions migrations/5.1-to-6.0/fixtures/after/transitrix.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Upgrade only the methodology pin.
methodology_version: "6.0.0" # reviewed version
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
type: source-document
title: "CFO onboarding interview"
description: "First-hand account of the order-fulfilment pain points from the CFO."
source: "_intake/originals/2026-07-01-cfo-interview.md"
source_hash: "sha256:0000000000000000000000000000000000000000000000000000000000000001"
created_at: 2026-07-01
confidence: observed
tags: [interview, fulfilment]
tracks: [okf]
status: processed
---

# Summary

The CFO described manual hand-offs between warehouse and finance as the primary bottleneck.
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
type: insight
title: "Order fulfilment bottleneck"
description: "Manual hand-offs between warehouse and finance slow order fulfilment."
source: _intake/processed/2026-07-01-cfo-interview.md
created_at: 2026-07-01
confidence: inferred
tags: [fulfilment, operations]
superseded_by: /knowledge/warehouse-finance-handoff.md
timestamp: 2026-07-01T10:00:00Z
---

# Body

Warehouse picks are complete before finance receives the invoice trigger, creating a multi-day lag.

# Citations

- CFO onboarding interview (`_intake/processed/2026-07-01-cfo-interview.md`)
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
type: finding
title: "Warehouse-finance handoff delay"
description: "Finance invoice trigger arrives days after warehouse completion."
source: _intake/processed/2026-07-01-cfo-interview.md
created_at: 2026-07-01
confidence: observed
tags: [finance, warehouse]
supersedes: /knowledge/order-fulfilment-bottleneck.md
timestamp: 2026-07-01T10:30:00Z
---

# Body

The hand-off relies on a spreadsheet emailed twice weekly; no system integration exists.

# Citations

- [Order fulfilment bottleneck](/knowledge/order-fulfilment-bottleneck.md)
2 changes: 2 additions & 0 deletions migrations/5.1-to-6.0/fixtures/before/transitrix.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Upgrade only the methodology pin.
methodology_version: "5.1.0" # reviewed version
Loading
Loading