From 723839f6b7597733487d47645d1212e5d544be91 Mon Sep 17 00:00:00 2001 From: mdheller <21163552+mdheller@users.noreply.github.com> Date: Fri, 3 Apr 2026 23:29:12 -0400 Subject: [PATCH 1/5] Add agent-plane capability descriptor patch fragment --- capd/imagelab.capd.patch.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 capd/imagelab.capd.patch.yaml diff --git a/capd/imagelab.capd.patch.yaml b/capd/imagelab.capd.patch.yaml new file mode 100644 index 0000000..2479d7b --- /dev/null +++ b/capd/imagelab.capd.patch.yaml @@ -0,0 +1,11 @@ +# imagelab.capd.v0.yaml patch fragment +contracts: + rpc_dir: "rpc" + schema_dir: "schemas" + session_dir: "sessions" + skill_dir: "skills" + memory_dir: "memory" +validators: + executionDecision: "python -m validators.execution_decision" + skillManifest: "python -m validators.skill_manifest" + sessionReceipt: "python -m validators.session_receipt" From d91e4a9ed6a9336aa1f12f61a2ac83d887c2fd57 Mon Sep 17 00:00:00 2001 From: mdheller <21163552+mdheller@users.noreply.github.com> Date: Sat, 4 Apr 2026 05:26:29 -0400 Subject: [PATCH 2/5] Add validator package scaffold for agent-plane contracts --- validators/__init__.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 validators/__init__.py diff --git a/validators/__init__.py b/validators/__init__.py new file mode 100644 index 0000000..bffe3f5 --- /dev/null +++ b/validators/__init__.py @@ -0,0 +1 @@ +"""Validator entrypoints for imagelab capability contract checks.""" From 91ba62ae754493cdac9ab63dacb4af5d34da70a9 Mon Sep 17 00:00:00 2001 From: mdheller <21163552+mdheller@users.noreply.github.com> Date: Sat, 4 Apr 2026 05:41:07 -0400 Subject: [PATCH 3/5] Add execution decision validator stub --- validators/execution_decision.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 validators/execution_decision.py diff --git a/validators/execution_decision.py b/validators/execution_decision.py new file mode 100644 index 0000000..5426cb6 --- /dev/null +++ b/validators/execution_decision.py @@ -0,0 +1,22 @@ +import json +import sys +from pathlib import Path + +EXPECTED_TYPE = 'ExecutionDecision' + + +def main() -> int: + if len(sys.argv) < 2: + print('usage: python -m validators.execution_decision ', file=sys.stderr) + return 2 + path = Path(sys.argv[1]) + data = json.loads(path.read_text(encoding='utf-8')) + if data.get('type') != EXPECTED_TYPE: + print(f'expected type={EXPECTED_TYPE!r}, got {data.get("type")!r}', file=sys.stderr) + return 1 + print(json.dumps({'ok': True, 'validated': EXPECTED_TYPE, 'path': str(path)})) + return 0 + + +if __name__ == '__main__': + raise SystemExit(main()) From 5807324233f612b8701322b21cfaf978ffde44ac Mon Sep 17 00:00:00 2001 From: mdheller <21163552+mdheller@users.noreply.github.com> Date: Sat, 4 Apr 2026 05:41:49 -0400 Subject: [PATCH 4/5] Add skill manifest validator stub --- validators/skill_manifest.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 validators/skill_manifest.py diff --git a/validators/skill_manifest.py b/validators/skill_manifest.py new file mode 100644 index 0000000..73668e4 --- /dev/null +++ b/validators/skill_manifest.py @@ -0,0 +1,22 @@ +import json +import sys +from pathlib import Path + +EXPECTED_TYPE = 'SkillManifest' + + +def main() -> int: + if len(sys.argv) < 2: + print('usage: python -m validators.skill_manifest ', file=sys.stderr) + return 2 + path = Path(sys.argv[1]) + data = json.loads(path.read_text(encoding='utf-8')) + if data.get('type') != EXPECTED_TYPE: + print(f'expected type={EXPECTED_TYPE!r}, got {data.get("type")!r}', file=sys.stderr) + return 1 + print(json.dumps({'ok': True, 'validated': EXPECTED_TYPE, 'path': str(path)})) + return 0 + + +if __name__ == '__main__': + raise SystemExit(main()) From 58951b8162006754a8036173ccf1df650980e51c Mon Sep 17 00:00:00 2001 From: mdheller <21163552+mdheller@users.noreply.github.com> Date: Sat, 4 Apr 2026 06:10:22 -0400 Subject: [PATCH 5/5] Add session receipt validator stub --- validators/session_receipt.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 validators/session_receipt.py diff --git a/validators/session_receipt.py b/validators/session_receipt.py new file mode 100644 index 0000000..262dd4c --- /dev/null +++ b/validators/session_receipt.py @@ -0,0 +1,22 @@ +import json +import sys +from pathlib import Path + +EXPECTED_TYPE = 'SessionReceipt' + + +def main() -> int: + if len(sys.argv) < 2: + print('usage: python -m validators.session_receipt ', file=sys.stderr) + return 2 + path = Path(sys.argv[1]) + data = json.loads(path.read_text(encoding='utf-8')) + if data.get('type') != EXPECTED_TYPE: + print(f'expected type={EXPECTED_TYPE!r}, got {data.get("type")!r}', file=sys.stderr) + return 1 + print(json.dumps({'ok': True, 'validated': EXPECTED_TYPE, 'path': str(path)})) + return 0 + + +if __name__ == '__main__': + raise SystemExit(main())