Apply GH-DEC-2026-017 to the layer declaration
INTENT.md governs; layer.yaml is now marked derived (derived: true, derived_from: INTENT.md). standard_version is removed from both forms (A12). The checker changes in the same commit: it no longer requires or prints standard_version, rejects it in either form, requires the derived markers, and checks both layer values against the closed four-token vocabulary after an ASCII case-fold (A9). Layer values are left as spelled (INTENT.md Engine, layer.yaml engine); they agree once folded. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Assistant: claude-code Assistant-Model: opus Assistant-Process: 63291@bnt-lap001 Assistant-Session: 8bd77868-ca68-4f49-bb1e-d539ecc0d703
This commit is contained in:
parent
00ffbd6dfe
commit
cd54d8e716
4 changed files with 104 additions and 10 deletions
|
|
@ -11,7 +11,6 @@ INTENT = """---
|
|||
layer: Engine
|
||||
role: PIP
|
||||
standard: netkingdom-security-layer-model
|
||||
standard_version: "0.7"
|
||||
---
|
||||
|
||||
# INTENT
|
||||
|
|
@ -21,7 +20,8 @@ DECL = {
|
|||
"layer": "engine",
|
||||
"role": "pip",
|
||||
"repository": "zone-engine",
|
||||
"standard_version": "0.7",
|
||||
"derived": True,
|
||||
"derived_from": "INTENT.md",
|
||||
"tooling_contacts": [],
|
||||
"unowned_capabilities": [],
|
||||
}
|
||||
|
|
@ -45,13 +45,30 @@ class LayerDeclarationTest(unittest.TestCase):
|
|||
self.assertEqual(decl["repository"], "zone-engine")
|
||||
self.assertEqual(decl["layer"], "engine")
|
||||
self.assertEqual(decl["role"], "pip")
|
||||
self.assertEqual(decl["standard_version"], "0.7")
|
||||
self.assertIs(decl["derived"], True)
|
||||
self.assertEqual(decl["derived_from"], "INTENT.md")
|
||||
self.assertEqual(decl["tooling_contacts"], [])
|
||||
self.assertIsNone(decl.get("pep_stance"))
|
||||
self.assertEqual(intent["layer"].lower(), "engine")
|
||||
self.assertEqual(intent["role"].lower(), "pip")
|
||||
self.assertEqual(layer.check_declaration_agrees(decl, intent), [])
|
||||
|
||||
def test_the_two_forms_agree_once_case_is_folded(self):
|
||||
"""A9/A11: assert the fold, not equality; nothing is re-spelled."""
|
||||
decl = yaml.safe_load(layer.DECL.read_text())
|
||||
intent = layer.load_intent()
|
||||
self.assertEqual(layer._norm(decl["layer"]), layer._norm(intent["layer"]))
|
||||
self.assertIn(layer._norm(intent["layer"]), layer.LAYER_VOCABULARY)
|
||||
|
||||
def test_no_declaration_carries_a_standard_version(self):
|
||||
"""GH-DEC-2026-017 §5 / A12, in both forms."""
|
||||
decl = yaml.safe_load(layer.DECL.read_text())
|
||||
self.assertNotIn("standard_version", decl)
|
||||
self.assertNotIn("standard_version", layer.load_intent())
|
||||
|
||||
def test_vocabulary_is_the_closed_four_tokens(self):
|
||||
self.assertEqual(layer.LAYER_VOCABULARY, {"taxonomy", "tooling", "engine", "staff"})
|
||||
|
||||
def test_checker_passes_on_the_real_tree(self):
|
||||
code, errors, _reports = layer.evaluate()
|
||||
self.assertEqual(code, 0, errors)
|
||||
|
|
@ -76,6 +93,43 @@ class LayerCheckerFailureTest(unittest.TestCase):
|
|||
self.assertEqual(code, 2)
|
||||
self.assertTrue(any("disagrees" in item for item in errors))
|
||||
|
||||
def test_case_only_difference_is_conforming(self):
|
||||
with TemporaryDirectory() as directory:
|
||||
root = Path(directory)
|
||||
_write_tree(root, intent=INTENT.replace("layer: Engine", "layer: ENGINE"))
|
||||
code, errors, _ = layer.evaluate(root=root)
|
||||
self.assertEqual(code, 0, errors)
|
||||
|
||||
def test_standard_version_in_either_form_is_exit_2(self):
|
||||
with TemporaryDirectory() as directory:
|
||||
root = Path(directory)
|
||||
_write_tree(root, decl={**DECL, "standard_version": "0.7"})
|
||||
code, errors, _ = layer.evaluate(root=root)
|
||||
self.assertEqual(code, 2)
|
||||
self.assertTrue(any("standard_version" in item for item in errors))
|
||||
with TemporaryDirectory() as directory:
|
||||
root = Path(directory)
|
||||
_write_tree(root, intent=INTENT.replace("role: PIP\n", 'role: PIP\nstandard_version: "0.7"\n'))
|
||||
code, errors, _ = layer.evaluate(root=root)
|
||||
self.assertEqual(code, 2)
|
||||
self.assertTrue(any("standard_version" in item for item in errors))
|
||||
|
||||
def test_sidecar_not_marked_derived_is_exit_2(self):
|
||||
for bad in ({**DECL, "derived": False}, {**DECL, "derived_from": "layer.yaml"}):
|
||||
with TemporaryDirectory() as directory:
|
||||
root = Path(directory)
|
||||
_write_tree(root, decl=bad)
|
||||
code, _errors, _ = layer.evaluate(root=root)
|
||||
self.assertEqual(code, 2)
|
||||
|
||||
def test_token_outside_vocabulary_is_exit_2(self):
|
||||
with TemporaryDirectory() as directory:
|
||||
root = Path(directory)
|
||||
_write_tree(root, intent=INTENT.replace("layer: Engine", "layer: surface"))
|
||||
code, errors, _ = layer.evaluate(root=root)
|
||||
self.assertEqual(code, 2)
|
||||
self.assertTrue(any("closed vocabulary" in item for item in errors))
|
||||
|
||||
def test_undeclared_tooling_client_is_exit_1(self):
|
||||
with TemporaryDirectory() as directory:
|
||||
root = Path(directory)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue