Update to EW AI Flowchart
Snapshot Oct 24, 2026 · 13:24 UTC · version 0.1.3
Package or technical metadata updated
Package or technical metadata updated
Observed in package metadata. These changes alone do not establish a new customer-facing feature.
Up to 3 plugins free · no card required.
All fields and original values.
These are saved file metadata. Open a changed file to read its text edits.
Package file
Sep 30, 2026 · 23:16 UTC
02f7a15172aefcf95502f5647488224986f053fe2adc74265f18ffd354ecf416
Oct 24, 2026 · 13:24 UTC
c716d2fd6a5fb27aafc60f16c66a17fe8af285a4d64f6d7cc6e0e812c031bca6
Package file
Sep 30, 2026 · 23:16 UTC
3767
Oct 24, 2026 · 13:24 UTC
2884
Package file
Sep 30, 2026 · 23:16 UTC
faa2d2af33cf2106814283845714c75677a293e97c2dead3fa9e825b32d604f6
Oct 24, 2026 · 13:24 UTC
3d006e8426d1e47e4a686ebcaeb0b467da60133dc5a64f461b75c3e4e1fc7e5f
Package file
Sep 30, 2026 · 23:16 UTC
1965
Oct 24, 2026 · 13:24 UTC
6308
Compare saved observations
Download comparison JSONChanged files
Choose a file to see its text changes. Binary or large files show metadata only.
docs/contract-knowledge/README.md →
docs/contract-knowledge/example.knowledge.json →
docs/contract-knowledge/technical-knowledge.schema.json →
scripts/build_knowledge_draft.py →
scripts/validate_knowledge_json.py
− removed · + added
--- before +++ after @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 +"""Validate EW technical knowledge contracts without executing source content.""" +from __future__ import annotations +import argparse +import json +import re +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +SCHEMA = ROOT / "docs/contract-knowledge/technical-knowledge.schema.json" +ID_RE = re.compile(r"^[A-Za-z][A-Za-z0-9._:-]*$") + +def validate(doc: object) -> list[str]: + errors = [] + if not isinstance(doc, dict): + return ["$: expected object"] + schema = json.loads(SCHEMA.read_text(encoding="utf-8")) + # Minimal deterministic structural checks; not a full JSON Schema engine. + for key in schema["required"]: + if key not in doc: + errors.append(f"$.{key}: required") + if doc.get("schemaVersion") != "ew-knowledge-0.1": + errors.append("$.schemaVersion: unsupported version") + if doc.get("contractType") != "technical_knowledge": + errors.append("$.contractType: must be technical_knowledge") + for key in ("knowledgeId", "title"): + if not isinstance(doc.get(key), str) or not doc[key].strip(): + errors.append(f"$.{key}: nonempty string required") + if isinstance(doc.get("knowledgeId"), str) and not ID_RE.fullmatch(doc["knowledgeId"]): + errors.append("$.knowledgeId: invalid stable ID") + source = doc.get("source") + if not isinstance(source, dict) or not all(isinstance(source.get(k), str) and source[k].strip() for k in ("documentId", "title")): + errors.append("$.source: documentId and title required") + review = doc.get("review") + if not isinstance(review, dict) or review.get("status") not in {"draft","pending_review","approved","revoked","superseded"} or not isinstance(review.get("version"), str) or not review["version"]: + errors.append("$.review: status and version required") + claims = doc.get("claims") + if not isinstance(claims, list) or not claims: + errors.append("$.claims: at least one claim required") + return errors + seen = set() + for i, claim in enumerate(claims): + p = f"$.claims[{i}]" + if not isinstance(claim, dict): + errors.append(f"{p}: object required") + continue + cid = claim.get("claimId") + if not isinstance(cid, str) or not cid.strip() or cid in seen: + errors.append(f"{p}.claimId: missing or duplicate") + seen.add(cid) + if not isinstance(claim.get("statement"), str) or not claim["statement"].strip(): + errors.append(f"{p}.statement: required") + status = claim.get("verificationStatus") + if status not in {"unverified","reviewed","rejected"}: + errors.append(f"{p}.verificationStatus: invalid") + anchors = claim.get("sourceAnchors") + if not isinstance(anchors, list): + errors.append(f"{p}.sourceAnchors: array required") + anchors = [] + if status == "reviewed" and not anchors: + errors.append(f"{p}.sourceAnchors: reviewed claim needs source evidence") + for j, anchor in enumerate(anchors): + if not isinstance(anchor, dict) or not isinstance(anchor.get("locator"), str) or not anchor["locator"].strip(): + errors.append(f"{p}.sourceAnchors[{j}]: source locator required") + if isinstance(review, dict) and review.get("status") == "approved": + if not review.get("reviewerId") or not review.get("approvedAt"): + errors.append("$.review: approved contract needs reviewerId and approvedAt") + if any(not isinstance(c, dict) or c.get("verificationStatus") != "reviewed" for c in claims): + errors.append("$.claims: approved contract cannot contain unreviewed claims") + return errors + +def main() -> int: + ap = argparse.ArgumentParser() + ap.add_argument("path", type=Path) + args = ap.parse_args() + try: + doc = json.loads(args.path.read_text(encoding="utf-8")) + except (ValueError, OSError) as exc: + print(f"ERROR: {exc}") + return 2 + errors = validate(doc) + for e in errors: + print("ERROR:", e) + print(f"Validation: {len(errors)} error(s)") + return 1 if errors else 0 + +if __name__ == "__main__": + raise SystemExit(main())
Full technical diff · 12 changed fields
changed /files/.codex-plugin~1plugin.json/sha256
"02f7a15172aefcf95502f5647488224986f053fe2adc74265f18ffd354ecf416"
"c716d2fd6a5fb27aafc60f16c66a17fe8af285a4d64f6d7cc6e0e812c031bca6"
changed /files/.codex-plugin~1plugin.json/size
3767
2884
changed /files/PRIVACY.md/sha256
"faa2d2af33cf2106814283845714c75677a293e97c2dead3fa9e825b32d604f6"
"3d006e8426d1e47e4a686ebcaeb0b467da60133dc5a64f461b75c3e4e1fc7e5f"
changed /files/PRIVACY.md/size
1965
6308
changed /files/README.md/sha256
"2b92ac9bf16012c2f8ccf972aeca5c8d9c8f3e6f039907e9336b53f3920688c8"
"be95a8a0e4c729037059c332d7aec58f46dd0d34ba9f322f6c457aac1d18bfc9"
changed /files/README.md/size
10513
13453
added /files/docs~1contract-knowledge~1README.md
Field was absent
{
"sha256": "0e93aec67b42c6df9c5728e79eed803e92282bd6ba9f46e5f601c00dd735f43c",
"size": 2432
}added /files/docs~1contract-knowledge~1example.knowledge.json
Field was absent
{
"sha256": "e0075b06f25636b325c97d1418746a99262214ad115d474735058c20c15895e7",
"size": 993
}added /files/docs~1contract-knowledge~1technical-knowledge.schema.json
Field was absent
{
"sha256": "2f924a382e20b905643ec7f1e739d67f7ec4c15775ed246371fde1c9860ac042",
"size": 4740
}added /files/scripts~1build_knowledge_draft.py
Field was absent
{
"sha256": "99962c4ff0484e461a54b841860f7833c742118d899b39db7cee05cfb93b990e",
"size": 2639
}added /files/scripts~1validate_knowledge_json.py
Field was absent
{
"sha256": "485edf99bf0f55f1dab9a42b0364a778bb453559a26101e21339aefc89fb2567",
"size": 4215
}added /files/tests~1test_knowledge_contract.py
Field was absent
{
"sha256": "5669fdb2094f6a03e33ba5b526e3b0bf7b2953282f1b84b3d533d83fa1e2db15",
"size": 1244
}Full snapshot data
{
"files": {
".codex-plugin/assets/composer-icon.png": {
"sha256": "5f626434942755d61e532dea25ede1b8f785298c70bf5bde8b0075f66534f141",
"size": 294227
},
".codex-plugin/assets/logo.png": {
"sha256": "b5572cec951440f7aa488bc760c9b480e1e71831fb3892aed64596dafe9a5e70",
"size": 873627
},
".codex-plugin/plugin.json": {
"sha256": "c716d2fd6a5fb27aafc60f16c66a17fe8af285a4d64f6d7cc6e0e812c031bca6",
"size": 2884
},
".gitignore": {
"sha256": "1c1a52565e0f572c6c5bb324503374b4b276398668fe2f62e2837fefab7a67a6",
"size": 81
},
"LICENSE": {
"sha256": "e2a2326a26cf362f0a7f42112063a72f29858c775783b563b49aa6195d598471",
"size": 932
},
"PRIVACY.md": {
"sha256": "3d006e8426d1e47e4a686ebcaeb0b467da60133dc5a64f461b75c3e4e1fc7e5f",
"size": 6308
},
"PUBLISHING_GUIDE.md": {
"sha256": "3efd2b5246782d2cda66fc8a7c3fc9438f33147d6539891763c1d54dbd90fac6",
"size": 1193
},
"README.md": {
"sha256": "be95a8a0e4c729037059c332d7aec58f46dd0d34ba9f322f6c457aac1d18bfc9",
"size": 13453
},
"SUPPORT.md": {
"sha256": "ff59f4c1e2c6a3adbf8c197bf6a64b6bfd05af54183f4873d9fead68e86c029d",
"size": 489
},
"TERMS.md": {
"sha256": "129004c130353137736d0856d9f2271ad934d4ae3f1142caed0f2ff927aa2c26",
"size": 2581
},
"assets/composer-icon.png": {
"sha256": "5f626434942755d61e532dea25ede1b8f785298c70bf5bde8b0075f66534f141",
"size": 294227
},
"assets/ew-ai-flowchart-showcase.png": {
"sha256": "f1fc6f272f8fb25f40f60e70f4dde7769f5eb49c0159d06b32e95fcb808c1c32",
"size": 1477409
},
"assets/logo.png": {
"sha256": "b5572cec951440f7aa488bc760c9b480e1e71831fb3892aed64596dafe9a5e70",
"size": 873627
},
"docs/contract-knowledge/README.md": {
"sha256": "0e93aec67b42c6df9c5728e79eed803e92282bd6ba9f46e5f601c00dd735f43c",
"size": 2432
},
"docs/contract-knowledge/example.knowledge.json": {
"sha256": "e0075b06f25636b325c97d1418746a99262214ad115d474735058c20c15895e7",
"size": 993
},
"docs/contract-knowledge/technical-knowledge.schema.json": {
"sha256": "2f924a382e20b905643ec7f1e739d67f7ec4c15775ed246371fde1c9860ac042",
"size": 4740
},
"scripts/build_knowledge_draft.py": {
"sha256": "99962c4ff0484e461a54b841860f7833c742118d899b39db7cee05cfb93b990e",
"size": 2639
},
"scripts/validate_efd_json.py": {
"sha256": "7177ba2985003a5c49e1ad03f75ea66d112063b5f0c46b96b8ab2ae82ebcd791",
"size": 13227
},
"scripts/validate_knowledge_json.py": {
"sha256": "485edf99bf0f55f1dab9a42b0364a778bb453559a26101e21339aefc89fb2567",
"size": 4215
},
"skills/efd-json-forge/SKILL.md": {
"sha256": "3654fc982536c0d974196ee041058d4dbe0924c5d7e4719618072fa5bc2ca6bc",
"size": 4783
},
"skills/efd-json-forge/agents/openai.yaml": {
"sha256": "ddaf441d1144e59db4d0421cd66390c9f435a4bcc0fd1ef9da3bca54ee725b57",
"size": 453
},
"skills/efd-json-forge/assets/icon.png": {
"sha256": "5f626434942755d61e532dea25ede1b8f785298c70bf5bde8b0075f66534f141",
"size": 294227
},
"skills/efd-json-forge/assets/logo.png": {
"sha256": "b5572cec951440f7aa488bc760c9b480e1e71831fb3892aed64596dafe9a5e70",
"size": 873627
},
"skills/efd-json-forge/assets/sample.efd.json": {
"sha256": "c3ec4e75f2916ff577b2568324fc10f89c44bba7cdcd0eeadc447f9de4db7ea4",
"size": 10860
},
"skills/efd-json-forge/references/efd-2.1.schema.json": {
"sha256": "42da1cfa16052e35a6f9e4dbc59cba223bc927510ce4cdfc35615a65ad1b89d0",
"size": 14898
},
"skills/efd-json-forge/references/efd-contract.md": {
"sha256": "984ae0dc62d32cf2452aa406d1d2ce8bd16fe664be9e8a14b91b4492d1dc63d1",
"size": 2898
},
"tests/test_knowledge_contract.py": {
"sha256": "5669fdb2094f6a03e33ba5b526e3b0bf7b2953282f1b84b3d533d83fa1e2db15",
"size": 1244
}
}
}SHA-256 of public snapshot: f2a489ed5596e4e86e1741982cdac15b64d8b2ebe6d9b898cd8286a3aaa1d939