From 1883489b0aeda79cc1d325f906dbb33cbe2a8be5 Mon Sep 17 00:00:00 2001 From: Greg Soucy Date: Wed, 18 Mar 2026 11:18:04 -0400 Subject: [PATCH] Add v1.1.0 commons examples --- README.md | 25 +++- .../invalid/001-analyze.request.invalid.json | 8 ++ .../invalid/900-analyze.receipt.invalid.json | 9 ++ .../json/valid/001-analyze.request.valid.json | 6 + .../json/valid/900-analyze.receipt.valid.json | 12 ++ .../ts/invalid/analyze.receipt.invalid.1.ts | 11 ++ .../ts/invalid/analyze.receipt.invalid.2.ts | 10 ++ .../ts/invalid/analyze.request.invalid.1.ts | 10 ++ .../ts/invalid/analyze.request.invalid.2.ts | 7 + .../ts/valid/analyze.receipt.valid.1.ts | 28 ++++ .../ts/valid/analyze.receipt.valid.2.ts | 14 ++ .../ts/valid/analyze.request.valid.1.ts | 17 +++ .../ts/valid/analyze.request.valid.2.ts | 12 ++ .../invalid/001-classify.request.invalid.json | 8 ++ .../invalid/900-classify.receipt.invalid.json | 9 ++ .../valid/001-classify.request.valid.json | 6 + .../valid/900-classify.receipt.valid.json | 12 ++ .../ts/invalid/classify.receipt.invalid.1.ts | 11 ++ .../ts/invalid/classify.request.invalid.1.ts | 10 ++ .../ts/valid/classify.receipt.valid.1.ts | 28 ++++ .../ts/valid/classify.request.valid.1.ts | 17 +++ .../invalid/001-clean.request.invalid.json | 8 ++ .../invalid/900-clean.receipt.invalid.json | 9 ++ .../json/valid/001-clean.request.valid.json | 6 + .../json/valid/900-clean.receipt.valid.json | 12 ++ .../ts/invalid/clean.receipt.invalid.1.ts | 11 ++ .../ts/invalid/clean.receipt.invalid.2.ts | 10 ++ .../ts/invalid/clean.request.invalid.1.ts | 10 ++ .../ts/invalid/clean.request.invalid.2.ts | 7 + .../clean/ts/valid/clean.receipt.valid.1.ts | 28 ++++ .../clean/ts/valid/clean.receipt.valid.2.ts | 14 ++ .../clean/ts/valid/clean.request.valid.1.ts | 17 +++ .../clean/ts/valid/clean.request.valid.2.ts | 12 ++ .../invalid/001-convert.request.invalid.json | 8 ++ .../invalid/900-convert.receipt.invalid.json | 9 ++ .../json/valid/001-convert.request.valid.json | 6 + .../json/valid/900-convert.receipt.valid.json | 12 ++ .../ts/invalid/convert.receipt.invalid.1.ts | 11 ++ .../ts/invalid/convert.receipt.invalid.2.ts | 10 ++ .../ts/invalid/convert.request.invalid.1.ts | 10 ++ .../ts/invalid/convert.request.invalid.2.ts | 7 + .../ts/valid/convert.receipt.valid.1.ts | 28 ++++ .../ts/valid/convert.receipt.valid.2.ts | 14 ++ .../ts/valid/convert.request.valid.1.ts | 17 +++ .../ts/valid/convert.request.valid.2.ts | 12 ++ .../invalid/001-describe.request.invalid.json | 8 ++ .../invalid/900-describe.receipt.invalid.json | 9 ++ .../valid/001-describe.request.valid.json | 6 + .../valid/900-describe.receipt.valid.json | 12 ++ .../ts/invalid/describe.receipt.invalid.1.ts | 11 ++ .../ts/invalid/describe.receipt.invalid.2.ts | 10 ++ .../ts/invalid/describe.request.invalid.1.ts | 10 ++ .../ts/invalid/describe.request.invalid.2.ts | 7 + .../ts/valid/describe.receipt.valid.1.ts | 28 ++++ .../ts/valid/describe.receipt.valid.2.ts | 14 ++ .../ts/valid/describe.request.valid.1.ts | 17 +++ .../ts/valid/describe.request.valid.2.ts | 12 ++ .../invalid/001-explain.request.invalid.json | 8 ++ .../invalid/900-explain.receipt.invalid.json | 9 ++ .../json/valid/001-explain.request.valid.json | 6 + .../json/valid/900-explain.receipt.valid.json | 12 ++ .../ts/invalid/explain.receipt.invalid.1.ts | 11 ++ .../ts/invalid/explain.receipt.invalid.2.ts | 10 ++ .../ts/invalid/explain.request.invalid.1.ts | 10 ++ .../ts/invalid/explain.request.invalid.2.ts | 7 + .../ts/valid/explain.receipt.valid.1.ts | 28 ++++ .../ts/valid/explain.receipt.valid.2.ts | 14 ++ .../ts/valid/explain.request.valid.1.ts | 17 +++ .../ts/valid/explain.request.valid.2.ts | 12 ++ .../invalid/001-fetch.request.invalid.json | 8 ++ .../invalid/900-fetch.receipt.invalid.json | 9 ++ .../json/valid/001-fetch.request.valid.json | 6 + .../json/valid/900-fetch.receipt.valid.json | 12 ++ .../ts/invalid/fetch.receipt.invalid.1.ts | 11 ++ .../ts/invalid/fetch.receipt.invalid.2.ts | 10 ++ .../ts/invalid/fetch.request.invalid.1.ts | 10 ++ .../ts/invalid/fetch.request.invalid.2.ts | 7 + .../fetch/ts/valid/fetch.receipt.valid.1.ts | 28 ++++ .../fetch/ts/valid/fetch.receipt.valid.2.ts | 14 ++ .../fetch/ts/valid/fetch.request.valid.1.ts | 17 +++ .../fetch/ts/valid/fetch.request.valid.2.ts | 12 ++ .../invalid/001-format.request.invalid.json | 8 ++ .../invalid/900-format.receipt.invalid.json | 9 ++ .../json/valid/001-format.request.valid.json | 6 + .../json/valid/900-format.receipt.valid.json | 12 ++ .../ts/invalid/format.receipt.invalid.1.ts | 11 ++ .../ts/invalid/format.receipt.invalid.2.ts | 10 ++ .../ts/invalid/format.request.invalid.1.ts | 10 ++ .../ts/invalid/format.request.invalid.2.ts | 7 + .../format/ts/valid/format.receipt.valid.1.ts | 28 ++++ .../format/ts/valid/format.receipt.valid.2.ts | 14 ++ .../format/ts/valid/format.request.valid.1.ts | 17 +++ .../format/ts/valid/format.request.valid.2.ts | 12 ++ .../invalid/001-parse.request.invalid.json | 8 ++ .../invalid/900-parse.receipt.invalid.json | 9 ++ .../json/valid/001-parse.request.valid.json | 6 + .../json/valid/900-parse.receipt.valid.json | 12 ++ .../ts/invalid/parse.receipt.invalid.1.ts | 11 ++ .../ts/invalid/parse.receipt.invalid.2.ts | 10 ++ .../ts/invalid/parse.request.invalid.1.ts | 10 ++ .../ts/invalid/parse.request.invalid.2.ts | 7 + .../parse/ts/valid/parse.receipt.valid.1.ts | 28 ++++ .../parse/ts/valid/parse.receipt.valid.2.ts | 14 ++ .../parse/ts/valid/parse.request.valid.1.ts | 17 +++ .../parse/ts/valid/parse.request.valid.2.ts | 12 ++ .../001-summarize.request.invalid.json | 8 ++ .../900-summarize.receipt.invalid.json | 9 ++ .../valid/001-summarize.request.valid.json | 6 + .../valid/900-summarize.receipt.valid.json | 12 ++ .../ts/invalid/summarize.receipt.invalid.1.ts | 11 ++ .../ts/invalid/summarize.receipt.invalid.2.ts | 10 ++ .../ts/invalid/summarize.request.invalid.1.ts | 10 ++ .../ts/invalid/summarize.request.invalid.2.ts | 7 + .../ts/invalid/summarize.request.invalid.ts | 7 + .../ts/summarize.receipt.examples.ts | 38 +++++ .../ts/summarize.request.examples.ts | 26 ++++ .../ts/valid/summarize.receipt.valid.1.ts | 28 ++++ .../ts/valid/summarize.receipt.valid.2.ts | 14 ++ .../ts/valid/summarize.request.valid.1.ts | 17 +++ .../ts/valid/summarize.request.valid.2.ts | 12 ++ .../ts/valid/summarize.request.valid.ts | 10 ++ manifest.json | 2 +- scripts/validate-examples.mjs | 131 +++++++++--------- 123 files changed, 1567 insertions(+), 69 deletions(-) create mode 100644 examples/v1.1.0/commons/analyze/json/invalid/001-analyze.request.invalid.json create mode 100644 examples/v1.1.0/commons/analyze/json/invalid/900-analyze.receipt.invalid.json create mode 100644 examples/v1.1.0/commons/analyze/json/valid/001-analyze.request.valid.json create mode 100644 examples/v1.1.0/commons/analyze/json/valid/900-analyze.receipt.valid.json create mode 100644 examples/v1.1.0/commons/analyze/ts/invalid/analyze.receipt.invalid.1.ts create mode 100644 examples/v1.1.0/commons/analyze/ts/invalid/analyze.receipt.invalid.2.ts create mode 100644 examples/v1.1.0/commons/analyze/ts/invalid/analyze.request.invalid.1.ts create mode 100644 examples/v1.1.0/commons/analyze/ts/invalid/analyze.request.invalid.2.ts create mode 100644 examples/v1.1.0/commons/analyze/ts/valid/analyze.receipt.valid.1.ts create mode 100644 examples/v1.1.0/commons/analyze/ts/valid/analyze.receipt.valid.2.ts create mode 100644 examples/v1.1.0/commons/analyze/ts/valid/analyze.request.valid.1.ts create mode 100644 examples/v1.1.0/commons/analyze/ts/valid/analyze.request.valid.2.ts create mode 100644 examples/v1.1.0/commons/classify/json/invalid/001-classify.request.invalid.json create mode 100644 examples/v1.1.0/commons/classify/json/invalid/900-classify.receipt.invalid.json create mode 100644 examples/v1.1.0/commons/classify/json/valid/001-classify.request.valid.json create mode 100644 examples/v1.1.0/commons/classify/json/valid/900-classify.receipt.valid.json create mode 100644 examples/v1.1.0/commons/classify/ts/invalid/classify.receipt.invalid.1.ts create mode 100644 examples/v1.1.0/commons/classify/ts/invalid/classify.request.invalid.1.ts create mode 100644 examples/v1.1.0/commons/classify/ts/valid/classify.receipt.valid.1.ts create mode 100644 examples/v1.1.0/commons/classify/ts/valid/classify.request.valid.1.ts create mode 100644 examples/v1.1.0/commons/clean/json/invalid/001-clean.request.invalid.json create mode 100644 examples/v1.1.0/commons/clean/json/invalid/900-clean.receipt.invalid.json create mode 100644 examples/v1.1.0/commons/clean/json/valid/001-clean.request.valid.json create mode 100644 examples/v1.1.0/commons/clean/json/valid/900-clean.receipt.valid.json create mode 100644 examples/v1.1.0/commons/clean/ts/invalid/clean.receipt.invalid.1.ts create mode 100644 examples/v1.1.0/commons/clean/ts/invalid/clean.receipt.invalid.2.ts create mode 100644 examples/v1.1.0/commons/clean/ts/invalid/clean.request.invalid.1.ts create mode 100644 examples/v1.1.0/commons/clean/ts/invalid/clean.request.invalid.2.ts create mode 100644 examples/v1.1.0/commons/clean/ts/valid/clean.receipt.valid.1.ts create mode 100644 examples/v1.1.0/commons/clean/ts/valid/clean.receipt.valid.2.ts create mode 100644 examples/v1.1.0/commons/clean/ts/valid/clean.request.valid.1.ts create mode 100644 examples/v1.1.0/commons/clean/ts/valid/clean.request.valid.2.ts create mode 100644 examples/v1.1.0/commons/convert/json/invalid/001-convert.request.invalid.json create mode 100644 examples/v1.1.0/commons/convert/json/invalid/900-convert.receipt.invalid.json create mode 100644 examples/v1.1.0/commons/convert/json/valid/001-convert.request.valid.json create mode 100644 examples/v1.1.0/commons/convert/json/valid/900-convert.receipt.valid.json create mode 100644 examples/v1.1.0/commons/convert/ts/invalid/convert.receipt.invalid.1.ts create mode 100644 examples/v1.1.0/commons/convert/ts/invalid/convert.receipt.invalid.2.ts create mode 100644 examples/v1.1.0/commons/convert/ts/invalid/convert.request.invalid.1.ts create mode 100644 examples/v1.1.0/commons/convert/ts/invalid/convert.request.invalid.2.ts create mode 100644 examples/v1.1.0/commons/convert/ts/valid/convert.receipt.valid.1.ts create mode 100644 examples/v1.1.0/commons/convert/ts/valid/convert.receipt.valid.2.ts create mode 100644 examples/v1.1.0/commons/convert/ts/valid/convert.request.valid.1.ts create mode 100644 examples/v1.1.0/commons/convert/ts/valid/convert.request.valid.2.ts create mode 100644 examples/v1.1.0/commons/describe/json/invalid/001-describe.request.invalid.json create mode 100644 examples/v1.1.0/commons/describe/json/invalid/900-describe.receipt.invalid.json create mode 100644 examples/v1.1.0/commons/describe/json/valid/001-describe.request.valid.json create mode 100644 examples/v1.1.0/commons/describe/json/valid/900-describe.receipt.valid.json create mode 100644 examples/v1.1.0/commons/describe/ts/invalid/describe.receipt.invalid.1.ts create mode 100644 examples/v1.1.0/commons/describe/ts/invalid/describe.receipt.invalid.2.ts create mode 100644 examples/v1.1.0/commons/describe/ts/invalid/describe.request.invalid.1.ts create mode 100644 examples/v1.1.0/commons/describe/ts/invalid/describe.request.invalid.2.ts create mode 100644 examples/v1.1.0/commons/describe/ts/valid/describe.receipt.valid.1.ts create mode 100644 examples/v1.1.0/commons/describe/ts/valid/describe.receipt.valid.2.ts create mode 100644 examples/v1.1.0/commons/describe/ts/valid/describe.request.valid.1.ts create mode 100644 examples/v1.1.0/commons/describe/ts/valid/describe.request.valid.2.ts create mode 100644 examples/v1.1.0/commons/explain/json/invalid/001-explain.request.invalid.json create mode 100644 examples/v1.1.0/commons/explain/json/invalid/900-explain.receipt.invalid.json create mode 100644 examples/v1.1.0/commons/explain/json/valid/001-explain.request.valid.json create mode 100644 examples/v1.1.0/commons/explain/json/valid/900-explain.receipt.valid.json create mode 100644 examples/v1.1.0/commons/explain/ts/invalid/explain.receipt.invalid.1.ts create mode 100644 examples/v1.1.0/commons/explain/ts/invalid/explain.receipt.invalid.2.ts create mode 100644 examples/v1.1.0/commons/explain/ts/invalid/explain.request.invalid.1.ts create mode 100644 examples/v1.1.0/commons/explain/ts/invalid/explain.request.invalid.2.ts create mode 100644 examples/v1.1.0/commons/explain/ts/valid/explain.receipt.valid.1.ts create mode 100644 examples/v1.1.0/commons/explain/ts/valid/explain.receipt.valid.2.ts create mode 100644 examples/v1.1.0/commons/explain/ts/valid/explain.request.valid.1.ts create mode 100644 examples/v1.1.0/commons/explain/ts/valid/explain.request.valid.2.ts create mode 100644 examples/v1.1.0/commons/fetch/json/invalid/001-fetch.request.invalid.json create mode 100644 examples/v1.1.0/commons/fetch/json/invalid/900-fetch.receipt.invalid.json create mode 100644 examples/v1.1.0/commons/fetch/json/valid/001-fetch.request.valid.json create mode 100644 examples/v1.1.0/commons/fetch/json/valid/900-fetch.receipt.valid.json create mode 100644 examples/v1.1.0/commons/fetch/ts/invalid/fetch.receipt.invalid.1.ts create mode 100644 examples/v1.1.0/commons/fetch/ts/invalid/fetch.receipt.invalid.2.ts create mode 100644 examples/v1.1.0/commons/fetch/ts/invalid/fetch.request.invalid.1.ts create mode 100644 examples/v1.1.0/commons/fetch/ts/invalid/fetch.request.invalid.2.ts create mode 100644 examples/v1.1.0/commons/fetch/ts/valid/fetch.receipt.valid.1.ts create mode 100644 examples/v1.1.0/commons/fetch/ts/valid/fetch.receipt.valid.2.ts create mode 100644 examples/v1.1.0/commons/fetch/ts/valid/fetch.request.valid.1.ts create mode 100644 examples/v1.1.0/commons/fetch/ts/valid/fetch.request.valid.2.ts create mode 100644 examples/v1.1.0/commons/format/json/invalid/001-format.request.invalid.json create mode 100644 examples/v1.1.0/commons/format/json/invalid/900-format.receipt.invalid.json create mode 100644 examples/v1.1.0/commons/format/json/valid/001-format.request.valid.json create mode 100644 examples/v1.1.0/commons/format/json/valid/900-format.receipt.valid.json create mode 100644 examples/v1.1.0/commons/format/ts/invalid/format.receipt.invalid.1.ts create mode 100644 examples/v1.1.0/commons/format/ts/invalid/format.receipt.invalid.2.ts create mode 100644 examples/v1.1.0/commons/format/ts/invalid/format.request.invalid.1.ts create mode 100644 examples/v1.1.0/commons/format/ts/invalid/format.request.invalid.2.ts create mode 100644 examples/v1.1.0/commons/format/ts/valid/format.receipt.valid.1.ts create mode 100644 examples/v1.1.0/commons/format/ts/valid/format.receipt.valid.2.ts create mode 100644 examples/v1.1.0/commons/format/ts/valid/format.request.valid.1.ts create mode 100644 examples/v1.1.0/commons/format/ts/valid/format.request.valid.2.ts create mode 100644 examples/v1.1.0/commons/parse/json/invalid/001-parse.request.invalid.json create mode 100644 examples/v1.1.0/commons/parse/json/invalid/900-parse.receipt.invalid.json create mode 100644 examples/v1.1.0/commons/parse/json/valid/001-parse.request.valid.json create mode 100644 examples/v1.1.0/commons/parse/json/valid/900-parse.receipt.valid.json create mode 100644 examples/v1.1.0/commons/parse/ts/invalid/parse.receipt.invalid.1.ts create mode 100644 examples/v1.1.0/commons/parse/ts/invalid/parse.receipt.invalid.2.ts create mode 100644 examples/v1.1.0/commons/parse/ts/invalid/parse.request.invalid.1.ts create mode 100644 examples/v1.1.0/commons/parse/ts/invalid/parse.request.invalid.2.ts create mode 100644 examples/v1.1.0/commons/parse/ts/valid/parse.receipt.valid.1.ts create mode 100644 examples/v1.1.0/commons/parse/ts/valid/parse.receipt.valid.2.ts create mode 100644 examples/v1.1.0/commons/parse/ts/valid/parse.request.valid.1.ts create mode 100644 examples/v1.1.0/commons/parse/ts/valid/parse.request.valid.2.ts create mode 100644 examples/v1.1.0/commons/summarize/json/invalid/001-summarize.request.invalid.json create mode 100644 examples/v1.1.0/commons/summarize/json/invalid/900-summarize.receipt.invalid.json create mode 100644 examples/v1.1.0/commons/summarize/json/valid/001-summarize.request.valid.json create mode 100644 examples/v1.1.0/commons/summarize/json/valid/900-summarize.receipt.valid.json create mode 100644 examples/v1.1.0/commons/summarize/ts/invalid/summarize.receipt.invalid.1.ts create mode 100644 examples/v1.1.0/commons/summarize/ts/invalid/summarize.receipt.invalid.2.ts create mode 100644 examples/v1.1.0/commons/summarize/ts/invalid/summarize.request.invalid.1.ts create mode 100644 examples/v1.1.0/commons/summarize/ts/invalid/summarize.request.invalid.2.ts create mode 100644 examples/v1.1.0/commons/summarize/ts/invalid/summarize.request.invalid.ts create mode 100644 examples/v1.1.0/commons/summarize/ts/summarize.receipt.examples.ts create mode 100644 examples/v1.1.0/commons/summarize/ts/summarize.request.examples.ts create mode 100644 examples/v1.1.0/commons/summarize/ts/valid/summarize.receipt.valid.1.ts create mode 100644 examples/v1.1.0/commons/summarize/ts/valid/summarize.receipt.valid.2.ts create mode 100644 examples/v1.1.0/commons/summarize/ts/valid/summarize.request.valid.1.ts create mode 100644 examples/v1.1.0/commons/summarize/ts/valid/summarize.request.valid.2.ts create mode 100644 examples/v1.1.0/commons/summarize/ts/valid/summarize.request.valid.ts diff --git a/README.md b/README.md index 5ba31ae..aa75d20 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,7 @@ npm install @commandlayer/commons ajv **Validate a request against a canonical verb schema** ``` -npx cl-validate examples/v1.0.0/commons/summarize/request.json +npx cl-validate examples/v1.1.0/commons/summarize/json/valid/001-summarize.request.valid.json # ✓ VALID — trace: bafybeieoynknza... ``` **Programmatic usage (Node.js/ESM)** @@ -371,13 +371,26 @@ protocol-commons/ │ ├── trace.schema.json │ └── receipt.base.schema.json ├── examples/ -│ └── v1.0.0/ +│ ├── v1.0.0/ +│ │ └── commons/ +│ │ └── / +│ │ ├── valid/ +│ │ │ └── *.json +│ │ └── invalid/ +│ │ └── *.json +│ └── v1.1.0/ │ └── commons/ │ └── / -│ ├── valid/ -│ │ └── *.json -│ └── invalid/ -│ └── *.json +│ ├── json/ +│ │ ├── valid/ +│ │ │ └── *.json +│ │ └── invalid/ +│ │ └── *.json +│ └── ts/ +│ ├── valid/ +│ │ └── *.ts +│ └── invalid/ +│ └── *.ts ├── checksums.txt ├── manifest.json ├── SPEC.md diff --git a/examples/v1.1.0/commons/analyze/json/invalid/001-analyze.request.invalid.json b/examples/v1.1.0/commons/analyze/json/invalid/001-analyze.request.invalid.json new file mode 100644 index 0000000..c96d24e --- /dev/null +++ b/examples/v1.1.0/commons/analyze/json/invalid/001-analyze.request.invalid.json @@ -0,0 +1,8 @@ +{ + "verb": "summarize", + "version": "1.1.0", + "input": { + "text": "This should be a string." + }, + "mode": "bullet-points" +} diff --git a/examples/v1.1.0/commons/analyze/json/invalid/900-analyze.receipt.invalid.json b/examples/v1.1.0/commons/analyze/json/invalid/900-analyze.receipt.invalid.json new file mode 100644 index 0000000..15d1503 --- /dev/null +++ b/examples/v1.1.0/commons/analyze/json/invalid/900-analyze.receipt.invalid.json @@ -0,0 +1,9 @@ +{ + "verb": "analyze", + "version": "1.1.0", + "status": "ok", + "timestamp": "not-a-date", + "request_hash": "sha256:xyz", + "signature": "short", + "error": "ok receipts should not rely on error only" +} diff --git a/examples/v1.1.0/commons/analyze/json/valid/001-analyze.request.valid.json b/examples/v1.1.0/commons/analyze/json/valid/001-analyze.request.valid.json new file mode 100644 index 0000000..762da0f --- /dev/null +++ b/examples/v1.1.0/commons/analyze/json/valid/001-analyze.request.valid.json @@ -0,0 +1,6 @@ +{ + "verb": "analyze", + "version": "1.1.0", + "input": "Review this smart-contract audit summary and extract the core risk themes for launch readiness.", + "mode": "extract" +} diff --git a/examples/v1.1.0/commons/analyze/json/valid/900-analyze.receipt.valid.json b/examples/v1.1.0/commons/analyze/json/valid/900-analyze.receipt.valid.json new file mode 100644 index 0000000..5c491c9 --- /dev/null +++ b/examples/v1.1.0/commons/analyze/json/valid/900-analyze.receipt.valid.json @@ -0,0 +1,12 @@ +{ + "verb": "analyze", + "version": "1.1.0", + "status": "ok", + "timestamp": "2026-03-18T12:00:00Z", + "agent": "analyzeagent.eth", + "request_hash": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "result_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "result_cid": "bafybeianalyzereceiptokexample0001", + "summary": "Core risks center on signer key rotation gaps, unresolved indexer scaling assumptions, and an unstated rollback plan.", + "signature": "sigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +} diff --git a/examples/v1.1.0/commons/analyze/ts/invalid/analyze.receipt.invalid.1.ts b/examples/v1.1.0/commons/analyze/ts/invalid/analyze.receipt.invalid.1.ts new file mode 100644 index 0000000..42b5591 --- /dev/null +++ b/examples/v1.1.0/commons/analyze/ts/invalid/analyze.receipt.invalid.1.ts @@ -0,0 +1,11 @@ +// INVALID analyze.receipt #1 — bad timestamp, malformed hash, short signature + +export const analyzeReceiptInvalid1: any = { + "verb": "analyze", + "version": "1.1.0", + "status": "ok", + "timestamp": "not-a-date", + "request_hash": "sha256:xyz", + "signature": "short", + "error": "ok receipts should not rely on error only" +}; diff --git a/examples/v1.1.0/commons/analyze/ts/invalid/analyze.receipt.invalid.2.ts b/examples/v1.1.0/commons/analyze/ts/invalid/analyze.receipt.invalid.2.ts new file mode 100644 index 0000000..086d060 --- /dev/null +++ b/examples/v1.1.0/commons/analyze/ts/invalid/analyze.receipt.invalid.2.ts @@ -0,0 +1,10 @@ +// INVALID analyze.receipt #2 — error status without required error field + +export const analyzeReceiptInvalid2: any = { + "verb": "analyze", + "version": "1.1.0", + "status": "error", + "timestamp": "2026-03-18T12:05:00Z", + "request_hash": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "signature": "sigBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" +}; diff --git a/examples/v1.1.0/commons/analyze/ts/invalid/analyze.request.invalid.1.ts b/examples/v1.1.0/commons/analyze/ts/invalid/analyze.request.invalid.1.ts new file mode 100644 index 0000000..57250a5 --- /dev/null +++ b/examples/v1.1.0/commons/analyze/ts/invalid/analyze.request.invalid.1.ts @@ -0,0 +1,10 @@ +// INVALID analyze.request #1 — wrong verb + wrong input type + unsupported mode + +export const analyzeRequestInvalid1: any = { + "verb": "summarize", + "version": "1.1.0", + "input": { + "text": "This should be a string." + }, + "mode": "bullet-points" +}; diff --git a/examples/v1.1.0/commons/analyze/ts/invalid/analyze.request.invalid.2.ts b/examples/v1.1.0/commons/analyze/ts/invalid/analyze.request.invalid.2.ts new file mode 100644 index 0000000..d47f111 --- /dev/null +++ b/examples/v1.1.0/commons/analyze/ts/invalid/analyze.request.invalid.2.ts @@ -0,0 +1,7 @@ +// INVALID analyze.request #2 — missing required input and wrong version type + +export const analyzeRequestInvalid2: any = { + "verb": "analyze", + "version": 110, + "mode": "extract" +}; diff --git a/examples/v1.1.0/commons/analyze/ts/valid/analyze.receipt.valid.1.ts b/examples/v1.1.0/commons/analyze/ts/valid/analyze.receipt.valid.1.ts new file mode 100644 index 0000000..5a61dbb --- /dev/null +++ b/examples/v1.1.0/commons/analyze/ts/valid/analyze.receipt.valid.1.ts @@ -0,0 +1,28 @@ +// VALID analyze.receipt #1 — success receipt with signer identity and hashes + +export interface AnalyzeReceipt { + verb: "analyze"; + version: "1.1.0"; + status: "ok" | "error"; + timestamp: string; + agent?: string; + request_hash: `sha256:${string}`; + result_hash?: `sha256:${string}`; + result_cid?: string; + summary?: string; + signature: string; + error?: string; +} + +export const analyzeReceiptValid1: AnalyzeReceipt = { + "verb": "analyze", + "version": "1.1.0", + "status": "ok", + "timestamp": "2026-03-18T12:00:00Z", + "agent": "analyzeagent.eth", + "request_hash": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "result_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "result_cid": "bafybeianalyzereceiptokexample0001", + "summary": "Core risks center on signer key rotation gaps, unresolved indexer scaling assumptions, and an unstated rollback plan.", + "signature": "sigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +}; diff --git a/examples/v1.1.0/commons/analyze/ts/valid/analyze.receipt.valid.2.ts b/examples/v1.1.0/commons/analyze/ts/valid/analyze.receipt.valid.2.ts new file mode 100644 index 0000000..29b6425 --- /dev/null +++ b/examples/v1.1.0/commons/analyze/ts/valid/analyze.receipt.valid.2.ts @@ -0,0 +1,14 @@ +// VALID analyze.receipt #2 — error receipt variant required by the schema + +import type { AnalyzeReceipt } from "./analyze.receipt.valid.1"; + +export const analyzeReceiptValid2: AnalyzeReceipt = { + "verb": "analyze", + "version": "1.1.0", + "status": "error", + "timestamp": "2026-03-18T12:05:00Z", + "agent": "analyzeagent.eth", + "request_hash": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "signature": "sigBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + "error": "analyze execution failed because the input could not be processed in the requested mode." +}; diff --git a/examples/v1.1.0/commons/analyze/ts/valid/analyze.request.valid.1.ts b/examples/v1.1.0/commons/analyze/ts/valid/analyze.request.valid.1.ts new file mode 100644 index 0000000..8b94cc7 --- /dev/null +++ b/examples/v1.1.0/commons/analyze/ts/valid/analyze.request.valid.1.ts @@ -0,0 +1,17 @@ +// VALID analyze.request #1 — aligned with schemas/v1.1.0/commons/analyze/analyze.request.schema.json + +export type AnalyzeMode = "classify" | "extract" | "score" | "summarize"; + +export interface AnalyzeRequest { + verb: "analyze"; + version: "1.1.0"; + input: string; + mode?: AnalyzeMode; +} + +export const analyzeRequestValid1: AnalyzeRequest = { + "verb": "analyze", + "version": "1.1.0", + "input": "Review this smart-contract audit summary and extract the core risk themes for launch readiness.", + "mode": "extract" +}; diff --git a/examples/v1.1.0/commons/analyze/ts/valid/analyze.request.valid.2.ts b/examples/v1.1.0/commons/analyze/ts/valid/analyze.request.valid.2.ts new file mode 100644 index 0000000..02836d6 --- /dev/null +++ b/examples/v1.1.0/commons/analyze/ts/valid/analyze.request.valid.2.ts @@ -0,0 +1,12 @@ +// VALID analyze.request #2 — alternate minimal, schema-accurate example + +import type { AnalyzeRequest, AnalyzeMode } from "./analyze.request.valid.1"; + +const mode: AnalyzeMode = "score"; + +export const analyzeRequestValid2: AnalyzeRequest = { + "verb": "analyze", + "version": "1.1.0", + "input": "Assess the following roadmap update and score operational risk based on stated blockers and dependencies.", + "mode": "score" +}; diff --git a/examples/v1.1.0/commons/classify/json/invalid/001-classify.request.invalid.json b/examples/v1.1.0/commons/classify/json/invalid/001-classify.request.invalid.json new file mode 100644 index 0000000..0b75ab4 --- /dev/null +++ b/examples/v1.1.0/commons/classify/json/invalid/001-classify.request.invalid.json @@ -0,0 +1,8 @@ +{ + "verb": "summarize", + "version": "1.1.0", + "input": { + "text": "This should be a string." + }, + "mode": "ordinal" +} diff --git a/examples/v1.1.0/commons/classify/json/invalid/900-classify.receipt.invalid.json b/examples/v1.1.0/commons/classify/json/invalid/900-classify.receipt.invalid.json new file mode 100644 index 0000000..2d87b6e --- /dev/null +++ b/examples/v1.1.0/commons/classify/json/invalid/900-classify.receipt.invalid.json @@ -0,0 +1,9 @@ +{ + "verb": "classify", + "version": "1.1.0", + "status": "ok", + "timestamp": "not-a-date", + "request_hash": "sha256:xyz", + "signature": "short", + "error": "ok receipts should not rely on error only" +} diff --git a/examples/v1.1.0/commons/classify/json/valid/001-classify.request.valid.json b/examples/v1.1.0/commons/classify/json/valid/001-classify.request.valid.json new file mode 100644 index 0000000..95458ab --- /dev/null +++ b/examples/v1.1.0/commons/classify/json/valid/001-classify.request.valid.json @@ -0,0 +1,6 @@ +{ + "verb": "classify", + "version": "1.1.0", + "input": "Payment failed after signature verification because the buyer wallet had insufficient balance.", + "mode": "single" +} diff --git a/examples/v1.1.0/commons/classify/json/valid/900-classify.receipt.valid.json b/examples/v1.1.0/commons/classify/json/valid/900-classify.receipt.valid.json new file mode 100644 index 0000000..bc0e4d5 --- /dev/null +++ b/examples/v1.1.0/commons/classify/json/valid/900-classify.receipt.valid.json @@ -0,0 +1,12 @@ +{ + "verb": "classify", + "version": "1.1.0", + "status": "ok", + "timestamp": "2026-03-18T12:00:00Z", + "agent": "classifyagent.eth", + "request_hash": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "result_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "result_cid": "bafybeiclassifyreceiptokexample0001", + "summary": "billing_issue", + "signature": "sigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +} diff --git a/examples/v1.1.0/commons/classify/ts/invalid/classify.receipt.invalid.1.ts b/examples/v1.1.0/commons/classify/ts/invalid/classify.receipt.invalid.1.ts new file mode 100644 index 0000000..4af2910 --- /dev/null +++ b/examples/v1.1.0/commons/classify/ts/invalid/classify.receipt.invalid.1.ts @@ -0,0 +1,11 @@ +// INVALID classify.receipt #1 — bad timestamp, malformed hash, short signature + +export const classifyReceiptInvalid1: any = { + "verb": "classify", + "version": "1.1.0", + "status": "ok", + "timestamp": "not-a-date", + "request_hash": "sha256:xyz", + "signature": "short", + "error": "ok receipts should not rely on error only" +}; diff --git a/examples/v1.1.0/commons/classify/ts/invalid/classify.request.invalid.1.ts b/examples/v1.1.0/commons/classify/ts/invalid/classify.request.invalid.1.ts new file mode 100644 index 0000000..daa4238 --- /dev/null +++ b/examples/v1.1.0/commons/classify/ts/invalid/classify.request.invalid.1.ts @@ -0,0 +1,10 @@ +// INVALID classify.request #1 — wrong verb + wrong input type + unsupported mode + +export const classifyRequestInvalid1: any = { + "verb": "summarize", + "version": "1.1.0", + "input": { + "text": "This should be a string." + }, + "mode": "ordinal" +}; diff --git a/examples/v1.1.0/commons/classify/ts/valid/classify.receipt.valid.1.ts b/examples/v1.1.0/commons/classify/ts/valid/classify.receipt.valid.1.ts new file mode 100644 index 0000000..a5194ee --- /dev/null +++ b/examples/v1.1.0/commons/classify/ts/valid/classify.receipt.valid.1.ts @@ -0,0 +1,28 @@ +// VALID classify.receipt #1 — success receipt with signer identity and hashes + +export interface ClassifyReceipt { + verb: "classify"; + version: "1.1.0"; + status: "ok" | "error"; + timestamp: string; + agent?: string; + request_hash: `sha256:${string}`; + result_hash?: `sha256:${string}`; + result_cid?: string; + summary?: string; + signature: string; + error?: string; +} + +export const classifyReceiptValid1: ClassifyReceipt = { + "verb": "classify", + "version": "1.1.0", + "status": "ok", + "timestamp": "2026-03-18T12:00:00Z", + "agent": "classifyagent.eth", + "request_hash": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "result_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "result_cid": "bafybeiclassifyreceiptokexample0001", + "summary": "billing_issue", + "signature": "sigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +}; diff --git a/examples/v1.1.0/commons/classify/ts/valid/classify.request.valid.1.ts b/examples/v1.1.0/commons/classify/ts/valid/classify.request.valid.1.ts new file mode 100644 index 0000000..e8f12a2 --- /dev/null +++ b/examples/v1.1.0/commons/classify/ts/valid/classify.request.valid.1.ts @@ -0,0 +1,17 @@ +// VALID classify.request #1 — aligned with schemas/v1.1.0/commons/classify/classify.request.schema.json + +export type ClassifyMode = "single" | "multi" | "hierarchical"; + +export interface ClassifyRequest { + verb: "classify"; + version: "1.1.0"; + input: string; + mode?: ClassifyMode; +} + +export const classifyRequestValid1: ClassifyRequest = { + "verb": "classify", + "version": "1.1.0", + "input": "Payment failed after signature verification because the buyer wallet had insufficient balance.", + "mode": "single" +}; diff --git a/examples/v1.1.0/commons/clean/json/invalid/001-clean.request.invalid.json b/examples/v1.1.0/commons/clean/json/invalid/001-clean.request.invalid.json new file mode 100644 index 0000000..3953a83 --- /dev/null +++ b/examples/v1.1.0/commons/clean/json/invalid/001-clean.request.invalid.json @@ -0,0 +1,8 @@ +{ + "verb": "summarize", + "version": "1.1.0", + "input": { + "text": "This should be a string." + }, + "mode": "compress" +} diff --git a/examples/v1.1.0/commons/clean/json/invalid/900-clean.receipt.invalid.json b/examples/v1.1.0/commons/clean/json/invalid/900-clean.receipt.invalid.json new file mode 100644 index 0000000..c21ea3d --- /dev/null +++ b/examples/v1.1.0/commons/clean/json/invalid/900-clean.receipt.invalid.json @@ -0,0 +1,9 @@ +{ + "verb": "clean", + "version": "1.1.0", + "status": "ok", + "timestamp": "not-a-date", + "request_hash": "sha256:xyz", + "signature": "short", + "error": "ok receipts should not rely on error only" +} diff --git a/examples/v1.1.0/commons/clean/json/valid/001-clean.request.valid.json b/examples/v1.1.0/commons/clean/json/valid/001-clean.request.valid.json new file mode 100644 index 0000000..7b0637e --- /dev/null +++ b/examples/v1.1.0/commons/clean/json/valid/001-clean.request.valid.json @@ -0,0 +1,6 @@ +{ + "verb": "clean", + "version": "1.1.0", + "input": " CommandLayer\tCommons v1.1.0\n", + "mode": "normalize" +} diff --git a/examples/v1.1.0/commons/clean/json/valid/900-clean.receipt.valid.json b/examples/v1.1.0/commons/clean/json/valid/900-clean.receipt.valid.json new file mode 100644 index 0000000..ada973f --- /dev/null +++ b/examples/v1.1.0/commons/clean/json/valid/900-clean.receipt.valid.json @@ -0,0 +1,12 @@ +{ + "verb": "clean", + "version": "1.1.0", + "status": "ok", + "timestamp": "2026-03-18T12:00:00Z", + "agent": "cleanagent.eth", + "request_hash": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "result_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "result_cid": "bafybeicleanreceiptokexample0001", + "summary": "Normalized whitespace and casing artifacts to yield a canonical single-line string.", + "signature": "sigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +} diff --git a/examples/v1.1.0/commons/clean/ts/invalid/clean.receipt.invalid.1.ts b/examples/v1.1.0/commons/clean/ts/invalid/clean.receipt.invalid.1.ts new file mode 100644 index 0000000..3e7944c --- /dev/null +++ b/examples/v1.1.0/commons/clean/ts/invalid/clean.receipt.invalid.1.ts @@ -0,0 +1,11 @@ +// INVALID clean.receipt #1 — bad timestamp, malformed hash, short signature + +export const cleanReceiptInvalid1: any = { + "verb": "clean", + "version": "1.1.0", + "status": "ok", + "timestamp": "not-a-date", + "request_hash": "sha256:xyz", + "signature": "short", + "error": "ok receipts should not rely on error only" +}; diff --git a/examples/v1.1.0/commons/clean/ts/invalid/clean.receipt.invalid.2.ts b/examples/v1.1.0/commons/clean/ts/invalid/clean.receipt.invalid.2.ts new file mode 100644 index 0000000..2530fa8 --- /dev/null +++ b/examples/v1.1.0/commons/clean/ts/invalid/clean.receipt.invalid.2.ts @@ -0,0 +1,10 @@ +// INVALID clean.receipt #2 — error status without required error field + +export const cleanReceiptInvalid2: any = { + "verb": "clean", + "version": "1.1.0", + "status": "error", + "timestamp": "2026-03-18T12:05:00Z", + "request_hash": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "signature": "sigBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" +}; diff --git a/examples/v1.1.0/commons/clean/ts/invalid/clean.request.invalid.1.ts b/examples/v1.1.0/commons/clean/ts/invalid/clean.request.invalid.1.ts new file mode 100644 index 0000000..9ca6e4e --- /dev/null +++ b/examples/v1.1.0/commons/clean/ts/invalid/clean.request.invalid.1.ts @@ -0,0 +1,10 @@ +// INVALID clean.request #1 — wrong verb + wrong input type + unsupported mode + +export const cleanRequestInvalid1: any = { + "verb": "summarize", + "version": "1.1.0", + "input": { + "text": "This should be a string." + }, + "mode": "compress" +}; diff --git a/examples/v1.1.0/commons/clean/ts/invalid/clean.request.invalid.2.ts b/examples/v1.1.0/commons/clean/ts/invalid/clean.request.invalid.2.ts new file mode 100644 index 0000000..6655a3b --- /dev/null +++ b/examples/v1.1.0/commons/clean/ts/invalid/clean.request.invalid.2.ts @@ -0,0 +1,7 @@ +// INVALID clean.request #2 — missing required input and wrong version type + +export const cleanRequestInvalid2: any = { + "verb": "clean", + "version": 110, + "mode": "normalize" +}; diff --git a/examples/v1.1.0/commons/clean/ts/valid/clean.receipt.valid.1.ts b/examples/v1.1.0/commons/clean/ts/valid/clean.receipt.valid.1.ts new file mode 100644 index 0000000..276eb85 --- /dev/null +++ b/examples/v1.1.0/commons/clean/ts/valid/clean.receipt.valid.1.ts @@ -0,0 +1,28 @@ +// VALID clean.receipt #1 — success receipt with signer identity and hashes + +export interface CleanReceipt { + verb: "clean"; + version: "1.1.0"; + status: "ok" | "error"; + timestamp: string; + agent?: string; + request_hash: `sha256:${string}`; + result_hash?: `sha256:${string}`; + result_cid?: string; + summary?: string; + signature: string; + error?: string; +} + +export const cleanReceiptValid1: CleanReceipt = { + "verb": "clean", + "version": "1.1.0", + "status": "ok", + "timestamp": "2026-03-18T12:00:00Z", + "agent": "cleanagent.eth", + "request_hash": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "result_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "result_cid": "bafybeicleanreceiptokexample0001", + "summary": "Normalized whitespace and casing artifacts to yield a canonical single-line string.", + "signature": "sigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +}; diff --git a/examples/v1.1.0/commons/clean/ts/valid/clean.receipt.valid.2.ts b/examples/v1.1.0/commons/clean/ts/valid/clean.receipt.valid.2.ts new file mode 100644 index 0000000..c4400a0 --- /dev/null +++ b/examples/v1.1.0/commons/clean/ts/valid/clean.receipt.valid.2.ts @@ -0,0 +1,14 @@ +// VALID clean.receipt #2 — error receipt variant required by the schema + +import type { CleanReceipt } from "./clean.receipt.valid.1"; + +export const cleanReceiptValid2: CleanReceipt = { + "verb": "clean", + "version": "1.1.0", + "status": "error", + "timestamp": "2026-03-18T12:05:00Z", + "agent": "cleanagent.eth", + "request_hash": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "signature": "sigBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + "error": "clean execution failed because the input could not be processed in the requested mode." +}; diff --git a/examples/v1.1.0/commons/clean/ts/valid/clean.request.valid.1.ts b/examples/v1.1.0/commons/clean/ts/valid/clean.request.valid.1.ts new file mode 100644 index 0000000..8b94a51 --- /dev/null +++ b/examples/v1.1.0/commons/clean/ts/valid/clean.request.valid.1.ts @@ -0,0 +1,17 @@ +// VALID clean.request #1 — aligned with schemas/v1.1.0/commons/clean/clean.request.schema.json + +export type CleanMode = "normalize" | "deduplicate" | "strip" | "sanitize"; + +export interface CleanRequest { + verb: "clean"; + version: "1.1.0"; + input: string; + mode?: CleanMode; +} + +export const cleanRequestValid1: CleanRequest = { + "verb": "clean", + "version": "1.1.0", + "input": " CommandLayer\tCommons v1.1.0\n", + "mode": "normalize" +}; diff --git a/examples/v1.1.0/commons/clean/ts/valid/clean.request.valid.2.ts b/examples/v1.1.0/commons/clean/ts/valid/clean.request.valid.2.ts new file mode 100644 index 0000000..75cd532 --- /dev/null +++ b/examples/v1.1.0/commons/clean/ts/valid/clean.request.valid.2.ts @@ -0,0 +1,12 @@ +// VALID clean.request #2 — alternate minimal, schema-accurate example + +import type { CleanRequest, CleanMode } from "./clean.request.valid.1"; + +const mode: CleanMode = "sanitize"; + +export const cleanRequestValid2: CleanRequest = { + "verb": "clean", + "version": "1.1.0", + "input": "

Signed receipt ready.

", + "mode": "sanitize" +}; diff --git a/examples/v1.1.0/commons/convert/json/invalid/001-convert.request.invalid.json b/examples/v1.1.0/commons/convert/json/invalid/001-convert.request.invalid.json new file mode 100644 index 0000000..8711499 --- /dev/null +++ b/examples/v1.1.0/commons/convert/json/invalid/001-convert.request.invalid.json @@ -0,0 +1,8 @@ +{ + "verb": "summarize", + "version": "1.1.0", + "input": { + "text": "This should be a string." + }, + "mode": "pdf" +} diff --git a/examples/v1.1.0/commons/convert/json/invalid/900-convert.receipt.invalid.json b/examples/v1.1.0/commons/convert/json/invalid/900-convert.receipt.invalid.json new file mode 100644 index 0000000..ba60db0 --- /dev/null +++ b/examples/v1.1.0/commons/convert/json/invalid/900-convert.receipt.invalid.json @@ -0,0 +1,9 @@ +{ + "verb": "convert", + "version": "1.1.0", + "status": "ok", + "timestamp": "not-a-date", + "request_hash": "sha256:xyz", + "signature": "short", + "error": "ok receipts should not rely on error only" +} diff --git a/examples/v1.1.0/commons/convert/json/valid/001-convert.request.valid.json b/examples/v1.1.0/commons/convert/json/valid/001-convert.request.valid.json new file mode 100644 index 0000000..379bdbf --- /dev/null +++ b/examples/v1.1.0/commons/convert/json/valid/001-convert.request.valid.json @@ -0,0 +1,6 @@ +{ + "verb": "convert", + "version": "1.1.0", + "input": "Title: Commons v1.1.0\nPoint 1: Flat requests\nPoint 2: Signed receipts", + "mode": "markdown" +} diff --git a/examples/v1.1.0/commons/convert/json/valid/900-convert.receipt.valid.json b/examples/v1.1.0/commons/convert/json/valid/900-convert.receipt.valid.json new file mode 100644 index 0000000..d543725 --- /dev/null +++ b/examples/v1.1.0/commons/convert/json/valid/900-convert.receipt.valid.json @@ -0,0 +1,12 @@ +{ + "verb": "convert", + "version": "1.1.0", + "status": "ok", + "timestamp": "2026-03-18T12:00:00Z", + "agent": "convertagent.eth", + "request_hash": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "result_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "result_cid": "bafybeiconvertreceiptokexample0001", + "summary": "Converted plain release notes into markdown sections suitable for documentation.", + "signature": "sigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +} diff --git a/examples/v1.1.0/commons/convert/ts/invalid/convert.receipt.invalid.1.ts b/examples/v1.1.0/commons/convert/ts/invalid/convert.receipt.invalid.1.ts new file mode 100644 index 0000000..322d2a5 --- /dev/null +++ b/examples/v1.1.0/commons/convert/ts/invalid/convert.receipt.invalid.1.ts @@ -0,0 +1,11 @@ +// INVALID convert.receipt #1 — bad timestamp, malformed hash, short signature + +export const convertReceiptInvalid1: any = { + "verb": "convert", + "version": "1.1.0", + "status": "ok", + "timestamp": "not-a-date", + "request_hash": "sha256:xyz", + "signature": "short", + "error": "ok receipts should not rely on error only" +}; diff --git a/examples/v1.1.0/commons/convert/ts/invalid/convert.receipt.invalid.2.ts b/examples/v1.1.0/commons/convert/ts/invalid/convert.receipt.invalid.2.ts new file mode 100644 index 0000000..0f84dfd --- /dev/null +++ b/examples/v1.1.0/commons/convert/ts/invalid/convert.receipt.invalid.2.ts @@ -0,0 +1,10 @@ +// INVALID convert.receipt #2 — error status without required error field + +export const convertReceiptInvalid2: any = { + "verb": "convert", + "version": "1.1.0", + "status": "error", + "timestamp": "2026-03-18T12:05:00Z", + "request_hash": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "signature": "sigBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" +}; diff --git a/examples/v1.1.0/commons/convert/ts/invalid/convert.request.invalid.1.ts b/examples/v1.1.0/commons/convert/ts/invalid/convert.request.invalid.1.ts new file mode 100644 index 0000000..b45fa82 --- /dev/null +++ b/examples/v1.1.0/commons/convert/ts/invalid/convert.request.invalid.1.ts @@ -0,0 +1,10 @@ +// INVALID convert.request #1 — wrong verb + wrong input type + unsupported mode + +export const convertRequestInvalid1: any = { + "verb": "summarize", + "version": "1.1.0", + "input": { + "text": "This should be a string." + }, + "mode": "pdf" +}; diff --git a/examples/v1.1.0/commons/convert/ts/invalid/convert.request.invalid.2.ts b/examples/v1.1.0/commons/convert/ts/invalid/convert.request.invalid.2.ts new file mode 100644 index 0000000..22cb974 --- /dev/null +++ b/examples/v1.1.0/commons/convert/ts/invalid/convert.request.invalid.2.ts @@ -0,0 +1,7 @@ +// INVALID convert.request #2 — missing required input and wrong version type + +export const convertRequestInvalid2: any = { + "verb": "convert", + "version": 110, + "mode": "markdown" +}; diff --git a/examples/v1.1.0/commons/convert/ts/valid/convert.receipt.valid.1.ts b/examples/v1.1.0/commons/convert/ts/valid/convert.receipt.valid.1.ts new file mode 100644 index 0000000..882c30f --- /dev/null +++ b/examples/v1.1.0/commons/convert/ts/valid/convert.receipt.valid.1.ts @@ -0,0 +1,28 @@ +// VALID convert.receipt #1 — success receipt with signer identity and hashes + +export interface ConvertReceipt { + verb: "convert"; + version: "1.1.0"; + status: "ok" | "error"; + timestamp: string; + agent?: string; + request_hash: `sha256:${string}`; + result_hash?: `sha256:${string}`; + result_cid?: string; + summary?: string; + signature: string; + error?: string; +} + +export const convertReceiptValid1: ConvertReceipt = { + "verb": "convert", + "version": "1.1.0", + "status": "ok", + "timestamp": "2026-03-18T12:00:00Z", + "agent": "convertagent.eth", + "request_hash": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "result_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "result_cid": "bafybeiconvertreceiptokexample0001", + "summary": "Converted plain release notes into markdown sections suitable for documentation.", + "signature": "sigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +}; diff --git a/examples/v1.1.0/commons/convert/ts/valid/convert.receipt.valid.2.ts b/examples/v1.1.0/commons/convert/ts/valid/convert.receipt.valid.2.ts new file mode 100644 index 0000000..9907d2f --- /dev/null +++ b/examples/v1.1.0/commons/convert/ts/valid/convert.receipt.valid.2.ts @@ -0,0 +1,14 @@ +// VALID convert.receipt #2 — error receipt variant required by the schema + +import type { ConvertReceipt } from "./convert.receipt.valid.1"; + +export const convertReceiptValid2: ConvertReceipt = { + "verb": "convert", + "version": "1.1.0", + "status": "error", + "timestamp": "2026-03-18T12:05:00Z", + "agent": "convertagent.eth", + "request_hash": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "signature": "sigBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + "error": "convert execution failed because the input could not be processed in the requested mode." +}; diff --git a/examples/v1.1.0/commons/convert/ts/valid/convert.request.valid.1.ts b/examples/v1.1.0/commons/convert/ts/valid/convert.request.valid.1.ts new file mode 100644 index 0000000..29646e4 --- /dev/null +++ b/examples/v1.1.0/commons/convert/ts/valid/convert.request.valid.1.ts @@ -0,0 +1,17 @@ +// VALID convert.request #1 — aligned with schemas/v1.1.0/commons/convert/convert.request.schema.json + +export type ConvertMode = "text" | "markdown" | "html" | "json"; + +export interface ConvertRequest { + verb: "convert"; + version: "1.1.0"; + input: string; + mode?: ConvertMode; +} + +export const convertRequestValid1: ConvertRequest = { + "verb": "convert", + "version": "1.1.0", + "input": "Title: Commons v1.1.0\nPoint 1: Flat requests\nPoint 2: Signed receipts", + "mode": "markdown" +}; diff --git a/examples/v1.1.0/commons/convert/ts/valid/convert.request.valid.2.ts b/examples/v1.1.0/commons/convert/ts/valid/convert.request.valid.2.ts new file mode 100644 index 0000000..616c072 --- /dev/null +++ b/examples/v1.1.0/commons/convert/ts/valid/convert.request.valid.2.ts @@ -0,0 +1,12 @@ +// VALID convert.request #2 — alternate minimal, schema-accurate example + +import type { ConvertRequest, ConvertMode } from "./convert.request.valid.1"; + +const mode: ConvertMode = "json"; + +export const convertRequestValid2: ConvertRequest = { + "verb": "convert", + "version": "1.1.0", + "input": "name=CommandLayer,version=1.1.0,verbs=10", + "mode": "json" +}; diff --git a/examples/v1.1.0/commons/describe/json/invalid/001-describe.request.invalid.json b/examples/v1.1.0/commons/describe/json/invalid/001-describe.request.invalid.json new file mode 100644 index 0000000..1825b6e --- /dev/null +++ b/examples/v1.1.0/commons/describe/json/invalid/001-describe.request.invalid.json @@ -0,0 +1,8 @@ +{ + "verb": "summarize", + "version": "1.1.0", + "input": { + "text": "This should be a string." + }, + "mode": "poetic" +} diff --git a/examples/v1.1.0/commons/describe/json/invalid/900-describe.receipt.invalid.json b/examples/v1.1.0/commons/describe/json/invalid/900-describe.receipt.invalid.json new file mode 100644 index 0000000..d16bf42 --- /dev/null +++ b/examples/v1.1.0/commons/describe/json/invalid/900-describe.receipt.invalid.json @@ -0,0 +1,9 @@ +{ + "verb": "describe", + "version": "1.1.0", + "status": "ok", + "timestamp": "not-a-date", + "request_hash": "sha256:xyz", + "signature": "short", + "error": "ok receipts should not rely on error only" +} diff --git a/examples/v1.1.0/commons/describe/json/valid/001-describe.request.valid.json b/examples/v1.1.0/commons/describe/json/valid/001-describe.request.valid.json new file mode 100644 index 0000000..af20734 --- /dev/null +++ b/examples/v1.1.0/commons/describe/json/valid/001-describe.request.valid.json @@ -0,0 +1,6 @@ +{ + "verb": "describe", + "version": "1.1.0", + "input": "A dashboard card showing receipt status, signer ENS, request hash, and result hash.", + "mode": "plain" +} diff --git a/examples/v1.1.0/commons/describe/json/valid/900-describe.receipt.valid.json b/examples/v1.1.0/commons/describe/json/valid/900-describe.receipt.valid.json new file mode 100644 index 0000000..fee5014 --- /dev/null +++ b/examples/v1.1.0/commons/describe/json/valid/900-describe.receipt.valid.json @@ -0,0 +1,12 @@ +{ + "verb": "describe", + "version": "1.1.0", + "status": "ok", + "timestamp": "2026-03-18T12:00:00Z", + "agent": "describeagent.eth", + "request_hash": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "result_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "result_cid": "bafybeidescribereceiptokexample0001", + "summary": "A compact interface card displaying whether a receipt succeeded and which agent signed it.", + "signature": "sigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +} diff --git a/examples/v1.1.0/commons/describe/ts/invalid/describe.receipt.invalid.1.ts b/examples/v1.1.0/commons/describe/ts/invalid/describe.receipt.invalid.1.ts new file mode 100644 index 0000000..6c4eec1 --- /dev/null +++ b/examples/v1.1.0/commons/describe/ts/invalid/describe.receipt.invalid.1.ts @@ -0,0 +1,11 @@ +// INVALID describe.receipt #1 — bad timestamp, malformed hash, short signature + +export const describeReceiptInvalid1: any = { + "verb": "describe", + "version": "1.1.0", + "status": "ok", + "timestamp": "not-a-date", + "request_hash": "sha256:xyz", + "signature": "short", + "error": "ok receipts should not rely on error only" +}; diff --git a/examples/v1.1.0/commons/describe/ts/invalid/describe.receipt.invalid.2.ts b/examples/v1.1.0/commons/describe/ts/invalid/describe.receipt.invalid.2.ts new file mode 100644 index 0000000..6905eaa --- /dev/null +++ b/examples/v1.1.0/commons/describe/ts/invalid/describe.receipt.invalid.2.ts @@ -0,0 +1,10 @@ +// INVALID describe.receipt #2 — error status without required error field + +export const describeReceiptInvalid2: any = { + "verb": "describe", + "version": "1.1.0", + "status": "error", + "timestamp": "2026-03-18T12:05:00Z", + "request_hash": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "signature": "sigBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" +}; diff --git a/examples/v1.1.0/commons/describe/ts/invalid/describe.request.invalid.1.ts b/examples/v1.1.0/commons/describe/ts/invalid/describe.request.invalid.1.ts new file mode 100644 index 0000000..98fb19a --- /dev/null +++ b/examples/v1.1.0/commons/describe/ts/invalid/describe.request.invalid.1.ts @@ -0,0 +1,10 @@ +// INVALID describe.request #1 — wrong verb + wrong input type + unsupported mode + +export const describeRequestInvalid1: any = { + "verb": "summarize", + "version": "1.1.0", + "input": { + "text": "This should be a string." + }, + "mode": "poetic" +}; diff --git a/examples/v1.1.0/commons/describe/ts/invalid/describe.request.invalid.2.ts b/examples/v1.1.0/commons/describe/ts/invalid/describe.request.invalid.2.ts new file mode 100644 index 0000000..97a90f7 --- /dev/null +++ b/examples/v1.1.0/commons/describe/ts/invalid/describe.request.invalid.2.ts @@ -0,0 +1,7 @@ +// INVALID describe.request #2 — missing required input and wrong version type + +export const describeRequestInvalid2: any = { + "verb": "describe", + "version": 110, + "mode": "plain" +}; diff --git a/examples/v1.1.0/commons/describe/ts/valid/describe.receipt.valid.1.ts b/examples/v1.1.0/commons/describe/ts/valid/describe.receipt.valid.1.ts new file mode 100644 index 0000000..e15f4b6 --- /dev/null +++ b/examples/v1.1.0/commons/describe/ts/valid/describe.receipt.valid.1.ts @@ -0,0 +1,28 @@ +// VALID describe.receipt #1 — success receipt with signer identity and hashes + +export interface DescribeReceipt { + verb: "describe"; + version: "1.1.0"; + status: "ok" | "error"; + timestamp: string; + agent?: string; + request_hash: `sha256:${string}`; + result_hash?: `sha256:${string}`; + result_cid?: string; + summary?: string; + signature: string; + error?: string; +} + +export const describeReceiptValid1: DescribeReceipt = { + "verb": "describe", + "version": "1.1.0", + "status": "ok", + "timestamp": "2026-03-18T12:00:00Z", + "agent": "describeagent.eth", + "request_hash": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "result_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "result_cid": "bafybeidescribereceiptokexample0001", + "summary": "A compact interface card displaying whether a receipt succeeded and which agent signed it.", + "signature": "sigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +}; diff --git a/examples/v1.1.0/commons/describe/ts/valid/describe.receipt.valid.2.ts b/examples/v1.1.0/commons/describe/ts/valid/describe.receipt.valid.2.ts new file mode 100644 index 0000000..8f4dacf --- /dev/null +++ b/examples/v1.1.0/commons/describe/ts/valid/describe.receipt.valid.2.ts @@ -0,0 +1,14 @@ +// VALID describe.receipt #2 — error receipt variant required by the schema + +import type { DescribeReceipt } from "./describe.receipt.valid.1"; + +export const describeReceiptValid2: DescribeReceipt = { + "verb": "describe", + "version": "1.1.0", + "status": "error", + "timestamp": "2026-03-18T12:05:00Z", + "agent": "describeagent.eth", + "request_hash": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "signature": "sigBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + "error": "describe execution failed because the input could not be processed in the requested mode." +}; diff --git a/examples/v1.1.0/commons/describe/ts/valid/describe.request.valid.1.ts b/examples/v1.1.0/commons/describe/ts/valid/describe.request.valid.1.ts new file mode 100644 index 0000000..42f1050 --- /dev/null +++ b/examples/v1.1.0/commons/describe/ts/valid/describe.request.valid.1.ts @@ -0,0 +1,17 @@ +// VALID describe.request #1 — aligned with schemas/v1.1.0/commons/describe/describe.request.schema.json + +export type DescribeMode = "brief" | "detailed" | "technical" | "plain"; + +export interface DescribeRequest { + verb: "describe"; + version: "1.1.0"; + input: string; + mode?: DescribeMode; +} + +export const describeRequestValid1: DescribeRequest = { + "verb": "describe", + "version": "1.1.0", + "input": "A dashboard card showing receipt status, signer ENS, request hash, and result hash.", + "mode": "plain" +}; diff --git a/examples/v1.1.0/commons/describe/ts/valid/describe.request.valid.2.ts b/examples/v1.1.0/commons/describe/ts/valid/describe.request.valid.2.ts new file mode 100644 index 0000000..72b200f --- /dev/null +++ b/examples/v1.1.0/commons/describe/ts/valid/describe.request.valid.2.ts @@ -0,0 +1,12 @@ +// VALID describe.request #2 — alternate minimal, schema-accurate example + +import type { DescribeRequest, DescribeMode } from "./describe.request.valid.1"; + +const mode: DescribeMode = "technical"; + +export const describeRequestValid2: DescribeRequest = { + "verb": "describe", + "version": "1.1.0", + "input": "A CLI validator command that compiles the v1.1.0 summarize request schema and checks one payload.", + "mode": "technical" +}; diff --git a/examples/v1.1.0/commons/explain/json/invalid/001-explain.request.invalid.json b/examples/v1.1.0/commons/explain/json/invalid/001-explain.request.invalid.json new file mode 100644 index 0000000..9444c4a --- /dev/null +++ b/examples/v1.1.0/commons/explain/json/invalid/001-explain.request.invalid.json @@ -0,0 +1,8 @@ +{ + "verb": "summarize", + "version": "1.1.0", + "input": { + "text": "This should be a string." + }, + "mode": "legalese" +} diff --git a/examples/v1.1.0/commons/explain/json/invalid/900-explain.receipt.invalid.json b/examples/v1.1.0/commons/explain/json/invalid/900-explain.receipt.invalid.json new file mode 100644 index 0000000..193c040 --- /dev/null +++ b/examples/v1.1.0/commons/explain/json/invalid/900-explain.receipt.invalid.json @@ -0,0 +1,9 @@ +{ + "verb": "explain", + "version": "1.1.0", + "status": "ok", + "timestamp": "not-a-date", + "request_hash": "sha256:xyz", + "signature": "short", + "error": "ok receipts should not rely on error only" +} diff --git a/examples/v1.1.0/commons/explain/json/valid/001-explain.request.valid.json b/examples/v1.1.0/commons/explain/json/valid/001-explain.request.valid.json new file mode 100644 index 0000000..ca93c08 --- /dev/null +++ b/examples/v1.1.0/commons/explain/json/valid/001-explain.request.valid.json @@ -0,0 +1,6 @@ +{ + "verb": "explain", + "version": "1.1.0", + "input": "Explain how a verifier should confirm that a receipt belongs to a request using request_hash and signature.", + "mode": "step-by-step" +} diff --git a/examples/v1.1.0/commons/explain/json/valid/900-explain.receipt.valid.json b/examples/v1.1.0/commons/explain/json/valid/900-explain.receipt.valid.json new file mode 100644 index 0000000..7949597 --- /dev/null +++ b/examples/v1.1.0/commons/explain/json/valid/900-explain.receipt.valid.json @@ -0,0 +1,12 @@ +{ + "verb": "explain", + "version": "1.1.0", + "status": "ok", + "timestamp": "2026-03-18T12:00:00Z", + "agent": "explainagent.eth", + "request_hash": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "result_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "result_cid": "bafybeiexplainreceiptokexample0001", + "summary": "Hash the original request, compare it to request_hash, then verify the detached signature under the agent identity before trusting the summary.", + "signature": "sigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +} diff --git a/examples/v1.1.0/commons/explain/ts/invalid/explain.receipt.invalid.1.ts b/examples/v1.1.0/commons/explain/ts/invalid/explain.receipt.invalid.1.ts new file mode 100644 index 0000000..29f80df --- /dev/null +++ b/examples/v1.1.0/commons/explain/ts/invalid/explain.receipt.invalid.1.ts @@ -0,0 +1,11 @@ +// INVALID explain.receipt #1 — bad timestamp, malformed hash, short signature + +export const explainReceiptInvalid1: any = { + "verb": "explain", + "version": "1.1.0", + "status": "ok", + "timestamp": "not-a-date", + "request_hash": "sha256:xyz", + "signature": "short", + "error": "ok receipts should not rely on error only" +}; diff --git a/examples/v1.1.0/commons/explain/ts/invalid/explain.receipt.invalid.2.ts b/examples/v1.1.0/commons/explain/ts/invalid/explain.receipt.invalid.2.ts new file mode 100644 index 0000000..14e6bb8 --- /dev/null +++ b/examples/v1.1.0/commons/explain/ts/invalid/explain.receipt.invalid.2.ts @@ -0,0 +1,10 @@ +// INVALID explain.receipt #2 — error status without required error field + +export const explainReceiptInvalid2: any = { + "verb": "explain", + "version": "1.1.0", + "status": "error", + "timestamp": "2026-03-18T12:05:00Z", + "request_hash": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "signature": "sigBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" +}; diff --git a/examples/v1.1.0/commons/explain/ts/invalid/explain.request.invalid.1.ts b/examples/v1.1.0/commons/explain/ts/invalid/explain.request.invalid.1.ts new file mode 100644 index 0000000..554eb9d --- /dev/null +++ b/examples/v1.1.0/commons/explain/ts/invalid/explain.request.invalid.1.ts @@ -0,0 +1,10 @@ +// INVALID explain.request #1 — wrong verb + wrong input type + unsupported mode + +export const explainRequestInvalid1: any = { + "verb": "summarize", + "version": "1.1.0", + "input": { + "text": "This should be a string." + }, + "mode": "legalese" +}; diff --git a/examples/v1.1.0/commons/explain/ts/invalid/explain.request.invalid.2.ts b/examples/v1.1.0/commons/explain/ts/invalid/explain.request.invalid.2.ts new file mode 100644 index 0000000..1d46c64 --- /dev/null +++ b/examples/v1.1.0/commons/explain/ts/invalid/explain.request.invalid.2.ts @@ -0,0 +1,7 @@ +// INVALID explain.request #2 — missing required input and wrong version type + +export const explainRequestInvalid2: any = { + "verb": "explain", + "version": 110, + "mode": "step-by-step" +}; diff --git a/examples/v1.1.0/commons/explain/ts/valid/explain.receipt.valid.1.ts b/examples/v1.1.0/commons/explain/ts/valid/explain.receipt.valid.1.ts new file mode 100644 index 0000000..299a1e8 --- /dev/null +++ b/examples/v1.1.0/commons/explain/ts/valid/explain.receipt.valid.1.ts @@ -0,0 +1,28 @@ +// VALID explain.receipt #1 — success receipt with signer identity and hashes + +export interface ExplainReceipt { + verb: "explain"; + version: "1.1.0"; + status: "ok" | "error"; + timestamp: string; + agent?: string; + request_hash: `sha256:${string}`; + result_hash?: `sha256:${string}`; + result_cid?: string; + summary?: string; + signature: string; + error?: string; +} + +export const explainReceiptValid1: ExplainReceipt = { + "verb": "explain", + "version": "1.1.0", + "status": "ok", + "timestamp": "2026-03-18T12:00:00Z", + "agent": "explainagent.eth", + "request_hash": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "result_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "result_cid": "bafybeiexplainreceiptokexample0001", + "summary": "Hash the original request, compare it to request_hash, then verify the detached signature under the agent identity before trusting the summary.", + "signature": "sigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +}; diff --git a/examples/v1.1.0/commons/explain/ts/valid/explain.receipt.valid.2.ts b/examples/v1.1.0/commons/explain/ts/valid/explain.receipt.valid.2.ts new file mode 100644 index 0000000..8639875 --- /dev/null +++ b/examples/v1.1.0/commons/explain/ts/valid/explain.receipt.valid.2.ts @@ -0,0 +1,14 @@ +// VALID explain.receipt #2 — error receipt variant required by the schema + +import type { ExplainReceipt } from "./explain.receipt.valid.1"; + +export const explainReceiptValid2: ExplainReceipt = { + "verb": "explain", + "version": "1.1.0", + "status": "error", + "timestamp": "2026-03-18T12:05:00Z", + "agent": "explainagent.eth", + "request_hash": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "signature": "sigBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + "error": "explain execution failed because the input could not be processed in the requested mode." +}; diff --git a/examples/v1.1.0/commons/explain/ts/valid/explain.request.valid.1.ts b/examples/v1.1.0/commons/explain/ts/valid/explain.request.valid.1.ts new file mode 100644 index 0000000..8910503 --- /dev/null +++ b/examples/v1.1.0/commons/explain/ts/valid/explain.request.valid.1.ts @@ -0,0 +1,17 @@ +// VALID explain.request #1 — aligned with schemas/v1.1.0/commons/explain/explain.request.schema.json + +export type ExplainMode = "step-by-step" | "conceptual" | "technical" | "simple"; + +export interface ExplainRequest { + verb: "explain"; + version: "1.1.0"; + input: string; + mode?: ExplainMode; +} + +export const explainRequestValid1: ExplainRequest = { + "verb": "explain", + "version": "1.1.0", + "input": "Explain how a verifier should confirm that a receipt belongs to a request using request_hash and signature.", + "mode": "step-by-step" +}; diff --git a/examples/v1.1.0/commons/explain/ts/valid/explain.request.valid.2.ts b/examples/v1.1.0/commons/explain/ts/valid/explain.request.valid.2.ts new file mode 100644 index 0000000..e2a5740 --- /dev/null +++ b/examples/v1.1.0/commons/explain/ts/valid/explain.request.valid.2.ts @@ -0,0 +1,12 @@ +// VALID explain.request #2 — alternate minimal, schema-accurate example + +import type { ExplainRequest, ExplainMode } from "./explain.request.valid.1"; + +const mode: ExplainMode = "simple"; + +export const explainRequestValid2: ExplainRequest = { + "verb": "explain", + "version": "1.1.0", + "input": "Explain why flat request schemas make hackathon judging easier.", + "mode": "simple" +}; diff --git a/examples/v1.1.0/commons/fetch/json/invalid/001-fetch.request.invalid.json b/examples/v1.1.0/commons/fetch/json/invalid/001-fetch.request.invalid.json new file mode 100644 index 0000000..b73dc92 --- /dev/null +++ b/examples/v1.1.0/commons/fetch/json/invalid/001-fetch.request.invalid.json @@ -0,0 +1,8 @@ +{ + "verb": "summarize", + "version": "1.1.0", + "input": { + "text": "This should be a string." + }, + "mode": "markdown" +} diff --git a/examples/v1.1.0/commons/fetch/json/invalid/900-fetch.receipt.invalid.json b/examples/v1.1.0/commons/fetch/json/invalid/900-fetch.receipt.invalid.json new file mode 100644 index 0000000..8904579 --- /dev/null +++ b/examples/v1.1.0/commons/fetch/json/invalid/900-fetch.receipt.invalid.json @@ -0,0 +1,9 @@ +{ + "verb": "fetch", + "version": "1.1.0", + "status": "ok", + "timestamp": "not-a-date", + "request_hash": "sha256:xyz", + "signature": "short", + "error": "ok receipts should not rely on error only" +} diff --git a/examples/v1.1.0/commons/fetch/json/valid/001-fetch.request.valid.json b/examples/v1.1.0/commons/fetch/json/valid/001-fetch.request.valid.json new file mode 100644 index 0000000..168c47a --- /dev/null +++ b/examples/v1.1.0/commons/fetch/json/valid/001-fetch.request.valid.json @@ -0,0 +1,6 @@ +{ + "verb": "fetch", + "version": "1.1.0", + "input": "https://api.commandlayer.org/v1/status", + "mode": "json" +} diff --git a/examples/v1.1.0/commons/fetch/json/valid/900-fetch.receipt.valid.json b/examples/v1.1.0/commons/fetch/json/valid/900-fetch.receipt.valid.json new file mode 100644 index 0000000..c8d2e68 --- /dev/null +++ b/examples/v1.1.0/commons/fetch/json/valid/900-fetch.receipt.valid.json @@ -0,0 +1,12 @@ +{ + "verb": "fetch", + "version": "1.1.0", + "status": "ok", + "timestamp": "2026-03-18T12:00:00Z", + "agent": "fetchagent.eth", + "request_hash": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "result_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "result_cid": "bafybeifetchreceiptokexample0001", + "summary": "Fetched a JSON status document describing service health, schema tag, and signer availability.", + "signature": "sigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +} diff --git a/examples/v1.1.0/commons/fetch/ts/invalid/fetch.receipt.invalid.1.ts b/examples/v1.1.0/commons/fetch/ts/invalid/fetch.receipt.invalid.1.ts new file mode 100644 index 0000000..1854756 --- /dev/null +++ b/examples/v1.1.0/commons/fetch/ts/invalid/fetch.receipt.invalid.1.ts @@ -0,0 +1,11 @@ +// INVALID fetch.receipt #1 — bad timestamp, malformed hash, short signature + +export const fetchReceiptInvalid1: any = { + "verb": "fetch", + "version": "1.1.0", + "status": "ok", + "timestamp": "not-a-date", + "request_hash": "sha256:xyz", + "signature": "short", + "error": "ok receipts should not rely on error only" +}; diff --git a/examples/v1.1.0/commons/fetch/ts/invalid/fetch.receipt.invalid.2.ts b/examples/v1.1.0/commons/fetch/ts/invalid/fetch.receipt.invalid.2.ts new file mode 100644 index 0000000..df857b4 --- /dev/null +++ b/examples/v1.1.0/commons/fetch/ts/invalid/fetch.receipt.invalid.2.ts @@ -0,0 +1,10 @@ +// INVALID fetch.receipt #2 — error status without required error field + +export const fetchReceiptInvalid2: any = { + "verb": "fetch", + "version": "1.1.0", + "status": "error", + "timestamp": "2026-03-18T12:05:00Z", + "request_hash": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "signature": "sigBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" +}; diff --git a/examples/v1.1.0/commons/fetch/ts/invalid/fetch.request.invalid.1.ts b/examples/v1.1.0/commons/fetch/ts/invalid/fetch.request.invalid.1.ts new file mode 100644 index 0000000..a8633aa --- /dev/null +++ b/examples/v1.1.0/commons/fetch/ts/invalid/fetch.request.invalid.1.ts @@ -0,0 +1,10 @@ +// INVALID fetch.request #1 — wrong verb + wrong input type + unsupported mode + +export const fetchRequestInvalid1: any = { + "verb": "summarize", + "version": "1.1.0", + "input": { + "text": "This should be a string." + }, + "mode": "markdown" +}; diff --git a/examples/v1.1.0/commons/fetch/ts/invalid/fetch.request.invalid.2.ts b/examples/v1.1.0/commons/fetch/ts/invalid/fetch.request.invalid.2.ts new file mode 100644 index 0000000..0bfc2f9 --- /dev/null +++ b/examples/v1.1.0/commons/fetch/ts/invalid/fetch.request.invalid.2.ts @@ -0,0 +1,7 @@ +// INVALID fetch.request #2 — missing required input and wrong version type + +export const fetchRequestInvalid2: any = { + "verb": "fetch", + "version": 110, + "mode": "json" +}; diff --git a/examples/v1.1.0/commons/fetch/ts/valid/fetch.receipt.valid.1.ts b/examples/v1.1.0/commons/fetch/ts/valid/fetch.receipt.valid.1.ts new file mode 100644 index 0000000..4df65ff --- /dev/null +++ b/examples/v1.1.0/commons/fetch/ts/valid/fetch.receipt.valid.1.ts @@ -0,0 +1,28 @@ +// VALID fetch.receipt #1 — success receipt with signer identity and hashes + +export interface FetchReceipt { + verb: "fetch"; + version: "1.1.0"; + status: "ok" | "error"; + timestamp: string; + agent?: string; + request_hash: `sha256:${string}`; + result_hash?: `sha256:${string}`; + result_cid?: string; + summary?: string; + signature: string; + error?: string; +} + +export const fetchReceiptValid1: FetchReceipt = { + "verb": "fetch", + "version": "1.1.0", + "status": "ok", + "timestamp": "2026-03-18T12:00:00Z", + "agent": "fetchagent.eth", + "request_hash": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "result_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "result_cid": "bafybeifetchreceiptokexample0001", + "summary": "Fetched a JSON status document describing service health, schema tag, and signer availability.", + "signature": "sigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +}; diff --git a/examples/v1.1.0/commons/fetch/ts/valid/fetch.receipt.valid.2.ts b/examples/v1.1.0/commons/fetch/ts/valid/fetch.receipt.valid.2.ts new file mode 100644 index 0000000..cca550c --- /dev/null +++ b/examples/v1.1.0/commons/fetch/ts/valid/fetch.receipt.valid.2.ts @@ -0,0 +1,14 @@ +// VALID fetch.receipt #2 — error receipt variant required by the schema + +import type { FetchReceipt } from "./fetch.receipt.valid.1"; + +export const fetchReceiptValid2: FetchReceipt = { + "verb": "fetch", + "version": "1.1.0", + "status": "error", + "timestamp": "2026-03-18T12:05:00Z", + "agent": "fetchagent.eth", + "request_hash": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "signature": "sigBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + "error": "fetch execution failed because the input could not be processed in the requested mode." +}; diff --git a/examples/v1.1.0/commons/fetch/ts/valid/fetch.request.valid.1.ts b/examples/v1.1.0/commons/fetch/ts/valid/fetch.request.valid.1.ts new file mode 100644 index 0000000..25ad792 --- /dev/null +++ b/examples/v1.1.0/commons/fetch/ts/valid/fetch.request.valid.1.ts @@ -0,0 +1,17 @@ +// VALID fetch.request #1 — aligned with schemas/v1.1.0/commons/fetch/fetch.request.schema.json + +export type FetchMode = "text" | "json" | "html" | "raw"; + +export interface FetchRequest { + verb: "fetch"; + version: "1.1.0"; + input: string; + mode?: FetchMode; +} + +export const fetchRequestValid1: FetchRequest = { + "verb": "fetch", + "version": "1.1.0", + "input": "https://api.commandlayer.org/v1/status", + "mode": "json" +}; diff --git a/examples/v1.1.0/commons/fetch/ts/valid/fetch.request.valid.2.ts b/examples/v1.1.0/commons/fetch/ts/valid/fetch.request.valid.2.ts new file mode 100644 index 0000000..53d1b18 --- /dev/null +++ b/examples/v1.1.0/commons/fetch/ts/valid/fetch.request.valid.2.ts @@ -0,0 +1,12 @@ +// VALID fetch.request #2 — alternate minimal, schema-accurate example + +import type { FetchRequest, FetchMode } from "./fetch.request.valid.1"; + +const mode: FetchMode = "text"; + +export const fetchRequestValid2: FetchRequest = { + "verb": "fetch", + "version": "1.1.0", + "input": "ipfs://bafybeigdyrzt6examplefetchartifact/readme.txt", + "mode": "text" +}; diff --git a/examples/v1.1.0/commons/format/json/invalid/001-format.request.invalid.json b/examples/v1.1.0/commons/format/json/invalid/001-format.request.invalid.json new file mode 100644 index 0000000..a5655ac --- /dev/null +++ b/examples/v1.1.0/commons/format/json/invalid/001-format.request.invalid.json @@ -0,0 +1,8 @@ +{ + "verb": "summarize", + "version": "1.1.0", + "input": { + "text": "This should be a string." + }, + "mode": "yaml" +} diff --git a/examples/v1.1.0/commons/format/json/invalid/900-format.receipt.invalid.json b/examples/v1.1.0/commons/format/json/invalid/900-format.receipt.invalid.json new file mode 100644 index 0000000..ac27dde --- /dev/null +++ b/examples/v1.1.0/commons/format/json/invalid/900-format.receipt.invalid.json @@ -0,0 +1,9 @@ +{ + "verb": "format", + "version": "1.1.0", + "status": "ok", + "timestamp": "not-a-date", + "request_hash": "sha256:xyz", + "signature": "short", + "error": "ok receipts should not rely on error only" +} diff --git a/examples/v1.1.0/commons/format/json/valid/001-format.request.valid.json b/examples/v1.1.0/commons/format/json/valid/001-format.request.valid.json new file mode 100644 index 0000000..611abd7 --- /dev/null +++ b/examples/v1.1.0/commons/format/json/valid/001-format.request.valid.json @@ -0,0 +1,6 @@ +{ + "verb": "format", + "version": "1.1.0", + "input": "Launch checklist: finalize schemas; pin CID; publish manifest; announce examples.", + "mode": "markdown" +} diff --git a/examples/v1.1.0/commons/format/json/valid/900-format.receipt.valid.json b/examples/v1.1.0/commons/format/json/valid/900-format.receipt.valid.json new file mode 100644 index 0000000..9a1a22e --- /dev/null +++ b/examples/v1.1.0/commons/format/json/valid/900-format.receipt.valid.json @@ -0,0 +1,12 @@ +{ + "verb": "format", + "version": "1.1.0", + "status": "ok", + "timestamp": "2026-03-18T12:00:00Z", + "agent": "formatagent.eth", + "request_hash": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "result_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "result_cid": "bafybeiformatreceiptokexample0001", + "summary": "Formatted the checklist into readable markdown with stable bullet structure.", + "signature": "sigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +} diff --git a/examples/v1.1.0/commons/format/ts/invalid/format.receipt.invalid.1.ts b/examples/v1.1.0/commons/format/ts/invalid/format.receipt.invalid.1.ts new file mode 100644 index 0000000..19846f5 --- /dev/null +++ b/examples/v1.1.0/commons/format/ts/invalid/format.receipt.invalid.1.ts @@ -0,0 +1,11 @@ +// INVALID format.receipt #1 — bad timestamp, malformed hash, short signature + +export const formatReceiptInvalid1: any = { + "verb": "format", + "version": "1.1.0", + "status": "ok", + "timestamp": "not-a-date", + "request_hash": "sha256:xyz", + "signature": "short", + "error": "ok receipts should not rely on error only" +}; diff --git a/examples/v1.1.0/commons/format/ts/invalid/format.receipt.invalid.2.ts b/examples/v1.1.0/commons/format/ts/invalid/format.receipt.invalid.2.ts new file mode 100644 index 0000000..d98e674 --- /dev/null +++ b/examples/v1.1.0/commons/format/ts/invalid/format.receipt.invalid.2.ts @@ -0,0 +1,10 @@ +// INVALID format.receipt #2 — error status without required error field + +export const formatReceiptInvalid2: any = { + "verb": "format", + "version": "1.1.0", + "status": "error", + "timestamp": "2026-03-18T12:05:00Z", + "request_hash": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "signature": "sigBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" +}; diff --git a/examples/v1.1.0/commons/format/ts/invalid/format.request.invalid.1.ts b/examples/v1.1.0/commons/format/ts/invalid/format.request.invalid.1.ts new file mode 100644 index 0000000..12f01b0 --- /dev/null +++ b/examples/v1.1.0/commons/format/ts/invalid/format.request.invalid.1.ts @@ -0,0 +1,10 @@ +// INVALID format.request #1 — wrong verb + wrong input type + unsupported mode + +export const formatRequestInvalid1: any = { + "verb": "summarize", + "version": "1.1.0", + "input": { + "text": "This should be a string." + }, + "mode": "yaml" +}; diff --git a/examples/v1.1.0/commons/format/ts/invalid/format.request.invalid.2.ts b/examples/v1.1.0/commons/format/ts/invalid/format.request.invalid.2.ts new file mode 100644 index 0000000..ffb60ed --- /dev/null +++ b/examples/v1.1.0/commons/format/ts/invalid/format.request.invalid.2.ts @@ -0,0 +1,7 @@ +// INVALID format.request #2 — missing required input and wrong version type + +export const formatRequestInvalid2: any = { + "verb": "format", + "version": 110, + "mode": "markdown" +}; diff --git a/examples/v1.1.0/commons/format/ts/valid/format.receipt.valid.1.ts b/examples/v1.1.0/commons/format/ts/valid/format.receipt.valid.1.ts new file mode 100644 index 0000000..c354bdd --- /dev/null +++ b/examples/v1.1.0/commons/format/ts/valid/format.receipt.valid.1.ts @@ -0,0 +1,28 @@ +// VALID format.receipt #1 — success receipt with signer identity and hashes + +export interface FormatReceipt { + verb: "format"; + version: "1.1.0"; + status: "ok" | "error"; + timestamp: string; + agent?: string; + request_hash: `sha256:${string}`; + result_hash?: `sha256:${string}`; + result_cid?: string; + summary?: string; + signature: string; + error?: string; +} + +export const formatReceiptValid1: FormatReceipt = { + "verb": "format", + "version": "1.1.0", + "status": "ok", + "timestamp": "2026-03-18T12:00:00Z", + "agent": "formatagent.eth", + "request_hash": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "result_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "result_cid": "bafybeiformatreceiptokexample0001", + "summary": "Formatted the checklist into readable markdown with stable bullet structure.", + "signature": "sigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +}; diff --git a/examples/v1.1.0/commons/format/ts/valid/format.receipt.valid.2.ts b/examples/v1.1.0/commons/format/ts/valid/format.receipt.valid.2.ts new file mode 100644 index 0000000..087115b --- /dev/null +++ b/examples/v1.1.0/commons/format/ts/valid/format.receipt.valid.2.ts @@ -0,0 +1,14 @@ +// VALID format.receipt #2 — error receipt variant required by the schema + +import type { FormatReceipt } from "./format.receipt.valid.1"; + +export const formatReceiptValid2: FormatReceipt = { + "verb": "format", + "version": "1.1.0", + "status": "error", + "timestamp": "2026-03-18T12:05:00Z", + "agent": "formatagent.eth", + "request_hash": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "signature": "sigBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + "error": "format execution failed because the input could not be processed in the requested mode." +}; diff --git a/examples/v1.1.0/commons/format/ts/valid/format.request.valid.1.ts b/examples/v1.1.0/commons/format/ts/valid/format.request.valid.1.ts new file mode 100644 index 0000000..7b8ba23 --- /dev/null +++ b/examples/v1.1.0/commons/format/ts/valid/format.request.valid.1.ts @@ -0,0 +1,17 @@ +// VALID format.request #1 — aligned with schemas/v1.1.0/commons/format/format.request.schema.json + +export type FormatMode = "markdown" | "html" | "plain" | "json"; + +export interface FormatRequest { + verb: "format"; + version: "1.1.0"; + input: string; + mode?: FormatMode; +} + +export const formatRequestValid1: FormatRequest = { + "verb": "format", + "version": "1.1.0", + "input": "Launch checklist: finalize schemas; pin CID; publish manifest; announce examples.", + "mode": "markdown" +}; diff --git a/examples/v1.1.0/commons/format/ts/valid/format.request.valid.2.ts b/examples/v1.1.0/commons/format/ts/valid/format.request.valid.2.ts new file mode 100644 index 0000000..3081635 --- /dev/null +++ b/examples/v1.1.0/commons/format/ts/valid/format.request.valid.2.ts @@ -0,0 +1,12 @@ +// VALID format.request #2 — alternate minimal, schema-accurate example + +import type { FormatRequest, FormatMode } from "./format.request.valid.1"; + +const mode: FormatMode = "json"; + +export const formatRequestValid2: FormatRequest = { + "verb": "format", + "version": "1.1.0", + "input": "validator=true signer=ready examples=generated", + "mode": "json" +}; diff --git a/examples/v1.1.0/commons/parse/json/invalid/001-parse.request.invalid.json b/examples/v1.1.0/commons/parse/json/invalid/001-parse.request.invalid.json new file mode 100644 index 0000000..5ad2a3a --- /dev/null +++ b/examples/v1.1.0/commons/parse/json/invalid/001-parse.request.invalid.json @@ -0,0 +1,8 @@ +{ + "verb": "summarize", + "version": "1.1.0", + "input": { + "text": "This should be a string." + }, + "mode": "xml" +} diff --git a/examples/v1.1.0/commons/parse/json/invalid/900-parse.receipt.invalid.json b/examples/v1.1.0/commons/parse/json/invalid/900-parse.receipt.invalid.json new file mode 100644 index 0000000..506d41f --- /dev/null +++ b/examples/v1.1.0/commons/parse/json/invalid/900-parse.receipt.invalid.json @@ -0,0 +1,9 @@ +{ + "verb": "parse", + "version": "1.1.0", + "status": "ok", + "timestamp": "not-a-date", + "request_hash": "sha256:xyz", + "signature": "short", + "error": "ok receipts should not rely on error only" +} diff --git a/examples/v1.1.0/commons/parse/json/valid/001-parse.request.valid.json b/examples/v1.1.0/commons/parse/json/valid/001-parse.request.valid.json new file mode 100644 index 0000000..b53ae61 --- /dev/null +++ b/examples/v1.1.0/commons/parse/json/valid/001-parse.request.valid.json @@ -0,0 +1,6 @@ +{ + "verb": "parse", + "version": "1.1.0", + "input": "{\"network\":\"base\",\"status\":\"green\",\"height\":22790111}", + "mode": "json" +} diff --git a/examples/v1.1.0/commons/parse/json/valid/900-parse.receipt.valid.json b/examples/v1.1.0/commons/parse/json/valid/900-parse.receipt.valid.json new file mode 100644 index 0000000..4c82647 --- /dev/null +++ b/examples/v1.1.0/commons/parse/json/valid/900-parse.receipt.valid.json @@ -0,0 +1,12 @@ +{ + "verb": "parse", + "version": "1.1.0", + "status": "ok", + "timestamp": "2026-03-18T12:00:00Z", + "agent": "parseagent.eth", + "request_hash": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "result_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "result_cid": "bafybeiparsereceiptokexample0001", + "summary": "Extracted top-level fields network, status, and height from the JSON payload.", + "signature": "sigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +} diff --git a/examples/v1.1.0/commons/parse/ts/invalid/parse.receipt.invalid.1.ts b/examples/v1.1.0/commons/parse/ts/invalid/parse.receipt.invalid.1.ts new file mode 100644 index 0000000..f905de4 --- /dev/null +++ b/examples/v1.1.0/commons/parse/ts/invalid/parse.receipt.invalid.1.ts @@ -0,0 +1,11 @@ +// INVALID parse.receipt #1 — bad timestamp, malformed hash, short signature + +export const parseReceiptInvalid1: any = { + "verb": "parse", + "version": "1.1.0", + "status": "ok", + "timestamp": "not-a-date", + "request_hash": "sha256:xyz", + "signature": "short", + "error": "ok receipts should not rely on error only" +}; diff --git a/examples/v1.1.0/commons/parse/ts/invalid/parse.receipt.invalid.2.ts b/examples/v1.1.0/commons/parse/ts/invalid/parse.receipt.invalid.2.ts new file mode 100644 index 0000000..fbe3d66 --- /dev/null +++ b/examples/v1.1.0/commons/parse/ts/invalid/parse.receipt.invalid.2.ts @@ -0,0 +1,10 @@ +// INVALID parse.receipt #2 — error status without required error field + +export const parseReceiptInvalid2: any = { + "verb": "parse", + "version": "1.1.0", + "status": "error", + "timestamp": "2026-03-18T12:05:00Z", + "request_hash": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "signature": "sigBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" +}; diff --git a/examples/v1.1.0/commons/parse/ts/invalid/parse.request.invalid.1.ts b/examples/v1.1.0/commons/parse/ts/invalid/parse.request.invalid.1.ts new file mode 100644 index 0000000..4f628fc --- /dev/null +++ b/examples/v1.1.0/commons/parse/ts/invalid/parse.request.invalid.1.ts @@ -0,0 +1,10 @@ +// INVALID parse.request #1 — wrong verb + wrong input type + unsupported mode + +export const parseRequestInvalid1: any = { + "verb": "summarize", + "version": "1.1.0", + "input": { + "text": "This should be a string." + }, + "mode": "xml" +}; diff --git a/examples/v1.1.0/commons/parse/ts/invalid/parse.request.invalid.2.ts b/examples/v1.1.0/commons/parse/ts/invalid/parse.request.invalid.2.ts new file mode 100644 index 0000000..2a1d21f --- /dev/null +++ b/examples/v1.1.0/commons/parse/ts/invalid/parse.request.invalid.2.ts @@ -0,0 +1,7 @@ +// INVALID parse.request #2 — missing required input and wrong version type + +export const parseRequestInvalid2: any = { + "verb": "parse", + "version": 110, + "mode": "json" +}; diff --git a/examples/v1.1.0/commons/parse/ts/valid/parse.receipt.valid.1.ts b/examples/v1.1.0/commons/parse/ts/valid/parse.receipt.valid.1.ts new file mode 100644 index 0000000..f9318e0 --- /dev/null +++ b/examples/v1.1.0/commons/parse/ts/valid/parse.receipt.valid.1.ts @@ -0,0 +1,28 @@ +// VALID parse.receipt #1 — success receipt with signer identity and hashes + +export interface ParseReceipt { + verb: "parse"; + version: "1.1.0"; + status: "ok" | "error"; + timestamp: string; + agent?: string; + request_hash: `sha256:${string}`; + result_hash?: `sha256:${string}`; + result_cid?: string; + summary?: string; + signature: string; + error?: string; +} + +export const parseReceiptValid1: ParseReceipt = { + "verb": "parse", + "version": "1.1.0", + "status": "ok", + "timestamp": "2026-03-18T12:00:00Z", + "agent": "parseagent.eth", + "request_hash": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "result_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "result_cid": "bafybeiparsereceiptokexample0001", + "summary": "Extracted top-level fields network, status, and height from the JSON payload.", + "signature": "sigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +}; diff --git a/examples/v1.1.0/commons/parse/ts/valid/parse.receipt.valid.2.ts b/examples/v1.1.0/commons/parse/ts/valid/parse.receipt.valid.2.ts new file mode 100644 index 0000000..13cf5ff --- /dev/null +++ b/examples/v1.1.0/commons/parse/ts/valid/parse.receipt.valid.2.ts @@ -0,0 +1,14 @@ +// VALID parse.receipt #2 — error receipt variant required by the schema + +import type { ParseReceipt } from "./parse.receipt.valid.1"; + +export const parseReceiptValid2: ParseReceipt = { + "verb": "parse", + "version": "1.1.0", + "status": "error", + "timestamp": "2026-03-18T12:05:00Z", + "agent": "parseagent.eth", + "request_hash": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "signature": "sigBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + "error": "parse execution failed because the input could not be processed in the requested mode." +}; diff --git a/examples/v1.1.0/commons/parse/ts/valid/parse.request.valid.1.ts b/examples/v1.1.0/commons/parse/ts/valid/parse.request.valid.1.ts new file mode 100644 index 0000000..9b3961d --- /dev/null +++ b/examples/v1.1.0/commons/parse/ts/valid/parse.request.valid.1.ts @@ -0,0 +1,17 @@ +// VALID parse.request #1 — aligned with schemas/v1.1.0/commons/parse/parse.request.schema.json + +export type ParseMode = "json" | "csv" | "key-value" | "list"; + +export interface ParseRequest { + verb: "parse"; + version: "1.1.0"; + input: string; + mode?: ParseMode; +} + +export const parseRequestValid1: ParseRequest = { + "verb": "parse", + "version": "1.1.0", + "input": "{\"network\":\"base\",\"status\":\"green\",\"height\":22790111}", + "mode": "json" +}; diff --git a/examples/v1.1.0/commons/parse/ts/valid/parse.request.valid.2.ts b/examples/v1.1.0/commons/parse/ts/valid/parse.request.valid.2.ts new file mode 100644 index 0000000..1479c1c --- /dev/null +++ b/examples/v1.1.0/commons/parse/ts/valid/parse.request.valid.2.ts @@ -0,0 +1,12 @@ +// VALID parse.request #2 — alternate minimal, schema-accurate example + +import type { ParseRequest, ParseMode } from "./parse.request.valid.1"; + +const mode: ParseMode = "key-value"; + +export const parseRequestValid2: ParseRequest = { + "verb": "parse", + "version": "1.1.0", + "input": "chain=base\nstatus=green\nlag_blocks=0", + "mode": "key-value" +}; diff --git a/examples/v1.1.0/commons/summarize/json/invalid/001-summarize.request.invalid.json b/examples/v1.1.0/commons/summarize/json/invalid/001-summarize.request.invalid.json new file mode 100644 index 0000000..25339f6 --- /dev/null +++ b/examples/v1.1.0/commons/summarize/json/invalid/001-summarize.request.invalid.json @@ -0,0 +1,8 @@ +{ + "verb": "analyze", + "version": "1.1.0", + "input": { + "text": "This should be a string." + }, + "mode": "tweet" +} diff --git a/examples/v1.1.0/commons/summarize/json/invalid/900-summarize.receipt.invalid.json b/examples/v1.1.0/commons/summarize/json/invalid/900-summarize.receipt.invalid.json new file mode 100644 index 0000000..5ba8bb9 --- /dev/null +++ b/examples/v1.1.0/commons/summarize/json/invalid/900-summarize.receipt.invalid.json @@ -0,0 +1,9 @@ +{ + "verb": "summarize", + "version": "1.1.0", + "status": "ok", + "timestamp": "not-a-date", + "request_hash": "sha256:xyz", + "signature": "short", + "error": "ok receipts should not rely on error only" +} diff --git a/examples/v1.1.0/commons/summarize/json/valid/001-summarize.request.valid.json b/examples/v1.1.0/commons/summarize/json/valid/001-summarize.request.valid.json new file mode 100644 index 0000000..60415a2 --- /dev/null +++ b/examples/v1.1.0/commons/summarize/json/valid/001-summarize.request.valid.json @@ -0,0 +1,6 @@ +{ + "verb": "summarize", + "version": "1.1.0", + "input": "CommandLayer Commons v1.1.0 simplifies every request into a flat verb/version/input shape and narrows receipts to signed execution evidence.", + "mode": "brief" +} diff --git a/examples/v1.1.0/commons/summarize/json/valid/900-summarize.receipt.valid.json b/examples/v1.1.0/commons/summarize/json/valid/900-summarize.receipt.valid.json new file mode 100644 index 0000000..aaf86b8 --- /dev/null +++ b/examples/v1.1.0/commons/summarize/json/valid/900-summarize.receipt.valid.json @@ -0,0 +1,12 @@ +{ + "verb": "summarize", + "version": "1.1.0", + "status": "ok", + "timestamp": "2026-03-18T12:00:00Z", + "agent": "summarizeagent.eth", + "request_hash": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "result_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "result_cid": "bafybeisummarizereceiptokexample0001", + "summary": "Commons v1.1.0 makes requests smaller and receipts easier to verify while preserving stable verb semantics.", + "signature": "sigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +} diff --git a/examples/v1.1.0/commons/summarize/ts/invalid/summarize.receipt.invalid.1.ts b/examples/v1.1.0/commons/summarize/ts/invalid/summarize.receipt.invalid.1.ts new file mode 100644 index 0000000..f24995a --- /dev/null +++ b/examples/v1.1.0/commons/summarize/ts/invalid/summarize.receipt.invalid.1.ts @@ -0,0 +1,11 @@ +// INVALID summarize.receipt #1 — bad timestamp, malformed hash, short signature + +export const summarizeReceiptInvalid1: any = { + "verb": "summarize", + "version": "1.1.0", + "status": "ok", + "timestamp": "not-a-date", + "request_hash": "sha256:xyz", + "signature": "short", + "error": "ok receipts should not rely on error only" +}; diff --git a/examples/v1.1.0/commons/summarize/ts/invalid/summarize.receipt.invalid.2.ts b/examples/v1.1.0/commons/summarize/ts/invalid/summarize.receipt.invalid.2.ts new file mode 100644 index 0000000..fc5b2d1 --- /dev/null +++ b/examples/v1.1.0/commons/summarize/ts/invalid/summarize.receipt.invalid.2.ts @@ -0,0 +1,10 @@ +// INVALID summarize.receipt #2 — error status without required error field + +export const summarizeReceiptInvalid2: any = { + "verb": "summarize", + "version": "1.1.0", + "status": "error", + "timestamp": "2026-03-18T12:05:00Z", + "request_hash": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "signature": "sigBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" +}; diff --git a/examples/v1.1.0/commons/summarize/ts/invalid/summarize.request.invalid.1.ts b/examples/v1.1.0/commons/summarize/ts/invalid/summarize.request.invalid.1.ts new file mode 100644 index 0000000..b80efbc --- /dev/null +++ b/examples/v1.1.0/commons/summarize/ts/invalid/summarize.request.invalid.1.ts @@ -0,0 +1,10 @@ +// INVALID summarize.request #1 — wrong verb + wrong input type + unsupported mode + +export const summarizeRequestInvalid1: any = { + "verb": "analyze", + "version": "1.1.0", + "input": { + "text": "This should be a string." + }, + "mode": "tweet" +}; diff --git a/examples/v1.1.0/commons/summarize/ts/invalid/summarize.request.invalid.2.ts b/examples/v1.1.0/commons/summarize/ts/invalid/summarize.request.invalid.2.ts new file mode 100644 index 0000000..4dd784b --- /dev/null +++ b/examples/v1.1.0/commons/summarize/ts/invalid/summarize.request.invalid.2.ts @@ -0,0 +1,7 @@ +// INVALID summarize.request #2 — missing required input and wrong version type + +export const summarizeRequestInvalid2: any = { + "verb": "summarize", + "version": 110, + "mode": "brief" +}; diff --git a/examples/v1.1.0/commons/summarize/ts/invalid/summarize.request.invalid.ts b/examples/v1.1.0/commons/summarize/ts/invalid/summarize.request.invalid.ts new file mode 100644 index 0000000..190f999 --- /dev/null +++ b/examples/v1.1.0/commons/summarize/ts/invalid/summarize.request.invalid.ts @@ -0,0 +1,7 @@ +// INVALID summarize.request aggregate example + +export const summarizeRequestInvalid: any = { + "verb": "summarize", + "version": "1.1.0", + "input": 7 +}; diff --git a/examples/v1.1.0/commons/summarize/ts/summarize.receipt.examples.ts b/examples/v1.1.0/commons/summarize/ts/summarize.receipt.examples.ts new file mode 100644 index 0000000..be1c903 --- /dev/null +++ b/examples/v1.1.0/commons/summarize/ts/summarize.receipt.examples.ts @@ -0,0 +1,38 @@ +// examples/v1.1.0/commons/summarize/ts/summarize.receipt.examples.ts + +export interface SummarizeReceipt { + verb: "summarize"; + version: "1.1.0"; + status: "ok" | "error"; + timestamp: string; + request_hash: `sha256:${string}`; + signature: string; + agent?: string; + result_hash?: `sha256:${string}`; + result_cid?: string; + summary?: string; + error?: string; +} + +export const validSummarizeReceiptExample: SummarizeReceipt = { + "verb": "summarize", + "version": "1.1.0", + "status": "ok", + "timestamp": "2026-03-18T12:00:00Z", + "agent": "summarizeagent.eth", + "request_hash": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "result_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "result_cid": "bafybeisummarizereceiptokexample0001", + "summary": "Commons v1.1.0 makes requests smaller and receipts easier to verify while preserving stable verb semantics.", + "signature": "sigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +}; + +export const invalidSummarizeReceiptExample: any = { + "verb": "summarize", + "version": "1.1.0", + "status": "ok", + "timestamp": "not-a-date", + "request_hash": "sha256:xyz", + "signature": "short", + "error": "ok receipts should not rely on error only" +}; diff --git a/examples/v1.1.0/commons/summarize/ts/summarize.request.examples.ts b/examples/v1.1.0/commons/summarize/ts/summarize.request.examples.ts new file mode 100644 index 0000000..e5ec2ce --- /dev/null +++ b/examples/v1.1.0/commons/summarize/ts/summarize.request.examples.ts @@ -0,0 +1,26 @@ +// examples/v1.1.0/commons/summarize/ts/summarize.request.examples.ts + +export type SummarizeMode = "brief" | "detailed" | "bullets" | "headline"; + +export interface SummarizeRequest { + verb: "summarize"; + version: "1.1.0"; + input: string; + mode?: SummarizeMode; +} + +export const validSummarizeRequestExample: SummarizeRequest = { + "verb": "summarize", + "version": "1.1.0", + "input": "CommandLayer Commons v1.1.0 simplifies every request into a flat verb/version/input shape and narrows receipts to signed execution evidence.", + "mode": "brief" +}; + +export const invalidSummarizeRequestExample: any = { + "verb": "analyze", + "version": "1.1.0", + "input": { + "text": "This should be a string." + }, + "mode": "tweet" +}; diff --git a/examples/v1.1.0/commons/summarize/ts/valid/summarize.receipt.valid.1.ts b/examples/v1.1.0/commons/summarize/ts/valid/summarize.receipt.valid.1.ts new file mode 100644 index 0000000..4530c59 --- /dev/null +++ b/examples/v1.1.0/commons/summarize/ts/valid/summarize.receipt.valid.1.ts @@ -0,0 +1,28 @@ +// VALID summarize.receipt #1 — success receipt with signer identity and hashes + +export interface SummarizeReceipt { + verb: "summarize"; + version: "1.1.0"; + status: "ok" | "error"; + timestamp: string; + agent?: string; + request_hash: `sha256:${string}`; + result_hash?: `sha256:${string}`; + result_cid?: string; + summary?: string; + signature: string; + error?: string; +} + +export const summarizeReceiptValid1: SummarizeReceipt = { + "verb": "summarize", + "version": "1.1.0", + "status": "ok", + "timestamp": "2026-03-18T12:00:00Z", + "agent": "summarizeagent.eth", + "request_hash": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "result_hash": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "result_cid": "bafybeisummarizereceiptokexample0001", + "summary": "Commons v1.1.0 makes requests smaller and receipts easier to verify while preserving stable verb semantics.", + "signature": "sigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +}; diff --git a/examples/v1.1.0/commons/summarize/ts/valid/summarize.receipt.valid.2.ts b/examples/v1.1.0/commons/summarize/ts/valid/summarize.receipt.valid.2.ts new file mode 100644 index 0000000..cec9228 --- /dev/null +++ b/examples/v1.1.0/commons/summarize/ts/valid/summarize.receipt.valid.2.ts @@ -0,0 +1,14 @@ +// VALID summarize.receipt #2 — error receipt variant required by the schema + +import type { SummarizeReceipt } from "./summarize.receipt.valid.1"; + +export const summarizeReceiptValid2: SummarizeReceipt = { + "verb": "summarize", + "version": "1.1.0", + "status": "error", + "timestamp": "2026-03-18T12:05:00Z", + "agent": "summarizeagent.eth", + "request_hash": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "signature": "sigBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + "error": "summarize execution failed because the input could not be processed in the requested mode." +}; diff --git a/examples/v1.1.0/commons/summarize/ts/valid/summarize.request.valid.1.ts b/examples/v1.1.0/commons/summarize/ts/valid/summarize.request.valid.1.ts new file mode 100644 index 0000000..c8f8ec9 --- /dev/null +++ b/examples/v1.1.0/commons/summarize/ts/valid/summarize.request.valid.1.ts @@ -0,0 +1,17 @@ +// VALID summarize.request #1 — aligned with schemas/v1.1.0/commons/summarize/summarize.request.schema.json + +export type SummarizeMode = "brief" | "detailed" | "bullets" | "headline"; + +export interface SummarizeRequest { + verb: "summarize"; + version: "1.1.0"; + input: string; + mode?: SummarizeMode; +} + +export const summarizeRequestValid1: SummarizeRequest = { + "verb": "summarize", + "version": "1.1.0", + "input": "CommandLayer Commons v1.1.0 simplifies every request into a flat verb/version/input shape and narrows receipts to signed execution evidence.", + "mode": "brief" +}; diff --git a/examples/v1.1.0/commons/summarize/ts/valid/summarize.request.valid.2.ts b/examples/v1.1.0/commons/summarize/ts/valid/summarize.request.valid.2.ts new file mode 100644 index 0000000..bf611c3 --- /dev/null +++ b/examples/v1.1.0/commons/summarize/ts/valid/summarize.request.valid.2.ts @@ -0,0 +1,12 @@ +// VALID summarize.request #2 — alternate minimal, schema-accurate example + +import type { SummarizeRequest, SummarizeMode } from "./summarize.request.valid.1"; + +const mode: SummarizeMode = "bullets"; + +export const summarizeRequestValid2: SummarizeRequest = { + "verb": "summarize", + "version": "1.1.0", + "input": "The release package includes ten canonical verbs, strict schemas, immutable checksums, and example payloads meant for validator demos and judge review.", + "mode": "bullets" +}; diff --git a/examples/v1.1.0/commons/summarize/ts/valid/summarize.request.valid.ts b/examples/v1.1.0/commons/summarize/ts/valid/summarize.request.valid.ts new file mode 100644 index 0000000..408a1cc --- /dev/null +++ b/examples/v1.1.0/commons/summarize/ts/valid/summarize.request.valid.ts @@ -0,0 +1,10 @@ +// VALID summarize.request aggregate example + +import type { SummarizeRequest } from "./summarize.request.examples"; + +export const summarizeRequestValid: SummarizeRequest = { + "verb": "summarize", + "version": "1.1.0", + "input": "The release package includes ten canonical verbs, strict schemas, immutable checksums, and example payloads meant for validator demos and judge review.", + "mode": "bullets" +}; diff --git a/manifest.json b/manifest.json index 1cd2536..84013a6 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "repository": "https://github.com/commandlayer/protocol-commons", "homepage": "https://commandlayer.org", "schemas_root": "schemas/v1.1.0", - "examples_root": "examples/v1.0.0", + "examples_root": "examples/v1.1.0", "checksum_file": "checksums.txt", "schemas_cid": "PENDING", "tag": "commons-schemas-v1.1.0", diff --git a/scripts/validate-examples.mjs b/scripts/validate-examples.mjs index f2f1220..b838fc8 100644 --- a/scripts/validate-examples.mjs +++ b/scripts/validate-examples.mjs @@ -7,11 +7,8 @@ import ajvErrors from "ajv-errors"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); +const ROOT = path.join(__dirname, ".."); -const SCHEMAS_ROOT = path.join(__dirname, "..", "schemas", "v1.0.0"); -const EXAMPLES_ROOT = path.join(__dirname, "..", "examples", "v1.0.0"); - -// Commons verbs currently defined in this repo const VERBS = [ "classify", "clean", @@ -25,6 +22,27 @@ const VERBS = [ "fetch" ]; +const EXAMPLE_CONFIGS = [ + { + version: "v1.0.0", + schemasRoot: path.join(ROOT, "schemas", "v1.0.0"), + examplesRoot: path.join(ROOT, "examples", "v1.0.0"), + requestSchemaId: (verb) => `https://commandlayer.org/schemas/v1.0.0/commons/${verb}/requests/${verb}.request.schema.json`, + receiptSchemaId: (verb) => `https://commandlayer.org/schemas/v1.0.0/commons/${verb}/receipts/${verb}.receipt.schema.json`, + validDir: (verb) => path.join(ROOT, "examples", "v1.0.0", "commons", verb, "valid"), + invalidDir: (verb) => path.join(ROOT, "examples", "v1.0.0", "commons", verb, "invalid") + }, + { + version: "v1.1.0", + schemasRoot: path.join(ROOT, "schemas", "v1.1.0"), + examplesRoot: path.join(ROOT, "examples", "v1.1.0"), + requestSchemaId: (verb) => `https://commandlayer.org/schemas/v1.1.0/commons/${verb}/${verb}.request.schema.json`, + receiptSchemaId: (verb) => `https://commandlayer.org/schemas/v1.1.0/commons/${verb}/${verb}.receipt.schema.json`, + validDir: (verb) => path.join(ROOT, "examples", "v1.1.0", "commons", verb, "json", "valid"), + invalidDir: (verb) => path.join(ROOT, "examples", "v1.1.0", "commons", verb, "json", "invalid") + } +]; + function createAjv() { const ajv = new Ajv2020({ strict: true, @@ -54,8 +72,7 @@ async function existsDir(dirPath) { } } -// Recursively load all schemas from SCHEMAS_ROOT into Ajv -async function preloadAllSchemas(ajv) { +async function preloadAllSchemas(ajv, rootDir) { async function walk(dir) { const entries = await fs.readdir(dir, { withFileTypes: true }); for (const entry of entries) { @@ -68,7 +85,6 @@ async function preloadAllSchemas(ajv) { try { ajv.addSchema(schema, key); } catch (err) { - // If schema with same key already exists in this Ajv instance, skip if (!String(err.message || "").includes("already exists")) { throw err; } @@ -77,85 +93,76 @@ async function preloadAllSchemas(ajv) { } } - await walk(SCHEMAS_ROOT); + await walk(rootDir); } -async function validateExamplesForVerb(verb, ajv) { - const validDir = path.join(EXAMPLES_ROOT, "commons", verb, "valid"); - const invalidDir = path.join(EXAMPLES_ROOT, "commons", verb, "invalid"); +async function validateDir(dirPath, expectedValid, validateRequest, validateReceipt) { + if (!(await existsDir(dirPath))) return; + const files = await fs.readdir(dirPath); + + for (const file of files) { + if (!file.endsWith(".json")) continue; + + const fullPath = path.join(dirPath, file); + const data = await loadJson(fullPath); + const isRequest = file.includes("request"); + const validateFn = isRequest ? validateRequest : validateReceipt; + const ok = validateFn(data); + + if (expectedValid && !ok) { + console.error(`❌ Expected VALID but got errors for ${fullPath}:`, validateFn.errors); + throw new Error(`Example should be valid but failed: ${fullPath}`); + } + + if (!expectedValid && ok) { + console.error(`❌ Expected INVALID but schema accepted ${fullPath}`); + throw new Error(`Example should be invalid but passed: ${fullPath}`); + } + } +} + +async function validateExamplesForVerb(config, verb, ajv) { + const validDir = config.validDir(verb); + const invalidDir = config.invalidDir(verb); const hasValidDir = await existsDir(validDir); const hasInvalidDir = await existsDir(invalidDir); if (!hasValidDir && !hasInvalidDir) { - console.log(`ℹ️ No examples found for verb: ${verb}, skipping.`); + console.log(`ℹ️ No ${config.version} examples found for verb: ${verb}, skipping.`); return; } - console.log(`\n🔍 Validating examples for verb: ${verb}`); - - const requestSchemaId = `https://commandlayer.org/schemas/v1.0.0/commons/${verb}/requests/${verb}.request.schema.json`; - const receiptSchemaId = `https://commandlayer.org/schemas/v1.0.0/commons/${verb}/receipts/${verb}.receipt.schema.json`; + console.log(`\n🔍 Validating ${config.version} examples for verb: ${verb}`); - const validateRequest = ajv.getSchema(requestSchemaId); - const validateReceipt = ajv.getSchema(receiptSchemaId); + const validateRequest = ajv.getSchema(config.requestSchemaId(verb)); + const validateReceipt = ajv.getSchema(config.receiptSchemaId(verb)); if (!validateRequest) { - throw new Error(`No compiled schema found in Ajv for request id: ${requestSchemaId}`); + throw new Error(`No compiled schema found in Ajv for request id: ${config.requestSchemaId(verb)}`); } if (!validateReceipt) { - throw new Error(`No compiled schema found in Ajv for receipt id: ${receiptSchemaId}`); - } - - async function validateDir(dirPath, expectedValid) { - if (!(await existsDir(dirPath))) return; - - const files = await fs.readdir(dirPath); - - for (const file of files) { - if (!file.endsWith(".json")) continue; - - const fullPath = path.join(dirPath, file); - const data = await loadJson(fullPath); - - const isRequest = file.includes("request"); - const validateFn = isRequest ? validateRequest : validateReceipt; - - const ok = validateFn(data); - - if (expectedValid && !ok) { - console.error( - `❌ Expected VALID but got errors for ${fullPath}:`, - validateFn.errors - ); - throw new Error(`Example should be valid but failed: ${fullPath}`); - } - - if (!expectedValid && ok) { - console.error( - `❌ Expected INVALID but schema accepted ${fullPath}` - ); - throw new Error(`Example should be invalid but passed: ${fullPath}`); - } - } + throw new Error(`No compiled schema found in Ajv for receipt id: ${config.receiptSchemaId(verb)}`); } - // Valid examples must pass - await validateDir(validDir, true); - - // Invalid examples must fail - await validateDir(invalidDir, false); + await validateDir(validDir, true, validateRequest, validateReceipt); + await validateDir(invalidDir, false, validateRequest, validateReceipt); - console.log(`✅ Examples OK for verb: ${verb}`); + console.log(`✅ ${config.version} examples OK for verb: ${verb}`); } async function main() { try { const ajv = createAjv(); - await preloadAllSchemas(ajv); - for (const verb of VERBS) { - await validateExamplesForVerb(verb, ajv); + for (const config of EXAMPLE_CONFIGS) { + await preloadAllSchemas(ajv, config.schemasRoot); + } + + for (const config of EXAMPLE_CONFIGS) { + for (const verb of VERBS) { + await validateExamplesForVerb(config, verb, ajv); + } } console.log("\n✅ All example validations completed.");