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
6 changes: 4 additions & 2 deletions examples/mesh-action-registry.example.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,15 @@
"manifestRef": "https://raw.githubusercontent.com/SocioProphet/Noetica/main/.sourceos/manifest.json",
"catalogRef": "https://raw.githubusercontent.com/SocioProphet/Noetica/main/agent-machine/lib/action-registry.ts",
"catalogDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111",
"verbOntologyRef": "https://raw.githubusercontent.com/SocioProphet/Noetica/main/agent-machine/data/verb-ontology.json"
"verbOntologyRef": "https://raw.githubusercontent.com/SocioProphet/Noetica/main/agent-machine/data/verb-ontology.json",
"implementsAbb": ["ABB.02"]
},
{
"repo": "SourceOS-Linux/agent-machine",
"manifestRef": "https://raw.githubusercontent.com/SourceOS-Linux/agent-machine/main/.sourceos/manifest.json",
"catalogRef": "https://raw.githubusercontent.com/SourceOS-Linux/agent-machine/main/src/agent_machine/actions.py",
"catalogDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222"
"catalogDigest": "sha256:2222222222222222222222222222222222222222222222222222222222222222",
"implementsAbb": ["ABB.01", "ABB.02"]
}
]
}
10 changes: 10 additions & 0 deletions schemas/MeshActionRegistry.json
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,16 @@
"type": "string",
"format": "uri-reference",
"description": "Optional pointer to the verb ontology the participant classifies against — see Noetica's verb-ontology.json. Absent means the participant does not classify its actions with verbs, which is a weaker claim (Apple's 4-primitive shape); present with a mismatched ontologyVersion is a decision the consumer must adjudicate."
},
"implementsAbb": {
"type": "array",
"minItems": 0,
"uniqueItems": true,
"items": {
"type": "string",
"pattern": "^ABB\\.[0-9]{2}$"
},
"description": "ABB identifiers this participant fills, per https://schemas.srcos.ai/v2/ArchitecturalBuildingBlock.json. Absent or empty means the participant is not claimed as a slot filler for any registered ABB — the consumer walking the registry for an ABB will not consider it. Non-empty means each listed ABB is an implementation contract the participant asserts it satisfies. Verification is the consumer's job (walk the ABB's protocol + requiredCapabilities, confirm the participant delivers each) — this field only establishes the CLAIM, not its truth. That split matters: a validator here could reject an unknown ABB.NN, but cannot know whether the participant actually satisfies its protocol without running the caller."
}
}
}
Expand Down
18 changes: 18 additions & 0 deletions tools/validate_mesh_action_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,24 @@ def broken(mutation) -> dict:
case("id URN not the mesh-action-registry namespace",
broken(lambda b: b.__setitem__("id", "urn:srcos:something:x")), False)

# implementsAbb — new field. Absent is fine (participant claims no ABB slots); present must be
# non-empty when set, and each entry must match the ABB.NN pattern.
print(" implementsAbb")
case("implementsAbb absent (participant claims no ABB slots)",
broken(lambda b: b["participants"][0].pop("implementsAbb", None)), True)
case("implementsAbb with a valid ABB claim",
broken(lambda b: b["participants"][0].__setitem__("implementsAbb", ["ABB.03"])), True)
Comment on lines +106 to +112
case("implementsAbb with multiple valid ABB claims",
broken(lambda b: b["participants"][0].__setitem__("implementsAbb", ["ABB.03", "ABB.07"])), True)
case("implementsAbb non-conforming pattern (bare number)",
broken(lambda b: b["participants"][0].__setitem__("implementsAbb", ["3"])), False)
case("implementsAbb non-conforming pattern (three digits)",
broken(lambda b: b["participants"][0].__setitem__("implementsAbb", ["ABB.003"])), False)
case("implementsAbb with duplicate ABB entries (uniqueItems)",
broken(lambda b: b["participants"][0].__setitem__("implementsAbb", ["ABB.03", "ABB.03"])), False)
case("implementsAbb wrong namespace",
broken(lambda b: b["participants"][0].__setitem__("implementsAbb", ["ARC.03"])), False)

case("undeclared property on a participant (schema is closed)",
broken(lambda b: b["participants"][0].__setitem__("zzUnknown", "leak")), False)

Expand Down
Loading