Close the last open import pins and the workplan (T04)
All checks were successful
CI Smoke / host-smoke (push) Successful in 1s
CI Smoke / container-smoke (push) Successful in 5s

interface-canon corrected its Interface and Endpoint pins at 20d7bfc2. Both were
pinned twice, to ITC-LAND and ITC-NET, because ITC-LAND section 13.2 lists them
in a seed-concept block while the Network Model defines them. Landscape section
13.2 now says in this repository that Interface, Endpoint and API are pointers
there and that the Network Model owns the first two, so the next reader does not
repeat it.

That is the fourth time in one day a list of concept names was read as a
definition, after CARING's Scope ladder, CARING's Environment values, and the
Landscape seeds that hid SoftwareSystem and SoftwareComponent. The closure
section names the pattern.

Both boundaries now resolve completely, security-canon 11 of 11 and
interface-canon 23 of 23, the registered copy is refreshed to the corrected
revision, and validation carries no drift warnings. The CLI test is rebuilt from
a deliberately broken copy so that a partner fixing its own pins can no longer
break this repository's suite.

make check passes with 59 tests, clean validation and no warnings.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 3588@bnt-lap001
Assistant-Session: 24b80f66-e5a7-4e61-99fe-2d422e6d17da
This commit is contained in:
tegwick 2026-09-20 23:50:52 +02:00
parent 44bc71babc
commit 1527b33999
6 changed files with 77 additions and 20 deletions

View file

@ -17,7 +17,11 @@ from info_tech_canon.maintenance import (
source_evidence,
)
from info_tech_canon.contracts import coverage
from info_tech_canon.federation import import_manifest_review, registered_drift
from info_tech_canon.federation import (
import_manifest_review,
registered_drift,
registered_manifests,
)
from info_tech_canon.service import (
DEFAULT_INFOSPACE_ROOT,
concept_declaration_checks,
@ -233,8 +237,21 @@ def test_registered_drift_names_the_partner_not_the_canon():
assert {item["partner"] for item in warnings} <= {"interface-canon", "security-canon"}
def test_import_review_cli_exits_non_zero_on_a_finding(capsys):
manifest = DEFAULT_INFOSPACE_ROOT / "interfaces/manifests/interface-canon.json"
def test_import_review_cli_exits_non_zero_on_a_finding(tmp_path, capsys):
"""Built from a broken copy: a partner fixing its pins must not break this."""
source = json.loads(
(DEFAULT_INFOSPACE_ROOT / "interfaces/manifests/interface-canon.json").read_text())
source["imports"][0]["concepts"] = ["Interface"]
manifest = tmp_path / "imports.json"
manifest.write_text(json.dumps(source))
assert main(["import-review", str(manifest)]) == 1
payload = json.loads(capsys.readouterr().out)
assert [item["concept"] for item in payload["findings"]] == ["Interface", "Endpoint"]
assert [item["concept"] for item in payload["findings"]] == ["Interface"]
def test_registered_manifests_resolve_completely():
for item in registered_manifests(load_context()):
review = import_manifest_review(
load_context(), DEFAULT_INFOSPACE_ROOT / "interfaces/manifests" / item["file"])
assert review["ok"], (item["partner"], review["findings"])