← EW AI FlowchartCONTENT HISTORY

Update to EW AI Flowchart

Snapshot Oct 24, 2026 · 13:24 UTC · version 0.1.3

WHAT CHANGED

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.

Save EW AI Flowchart and check future changes in Following.

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

Before

Sep 30, 2026 · 23:16 UTC

02f7a15172aefcf95502f5647488224986f053fe2adc74265f18ffd354ecf416

After

Oct 24, 2026 · 13:24 UTC

c716d2fd6a5fb27aafc60f16c66a17fe8af285a4d64f6d7cc6e0e812c031bca6

Package file

Before

Sep 30, 2026 · 23:16 UTC

3767

After

Oct 24, 2026 · 13:24 UTC

2884

Package file

Before

Sep 30, 2026 · 23:16 UTC

faa2d2af33cf2106814283845714c75677a293e97c2dead3fa9e825b32d604f6

After

Oct 24, 2026 · 13:24 UTC

3d006e8426d1e47e4a686ebcaeb0b467da60133dc5a64f461b75c3e4e1fc7e5f

Package file

Before

Sep 30, 2026 · 23:16 UTC

1965

After

Oct 24, 2026 · 13:24 UTC

6308

Compare saved observations

Download comparison JSON

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

BEFORE
"02f7a15172aefcf95502f5647488224986f053fe2adc74265f18ffd354ecf416"
AFTER
"c716d2fd6a5fb27aafc60f16c66a17fe8af285a4d64f6d7cc6e0e812c031bca6"

changed /files/.codex-plugin~1plugin.json/size

BEFORE
3767
AFTER
2884

changed /files/PRIVACY.md/sha256

BEFORE
"faa2d2af33cf2106814283845714c75677a293e97c2dead3fa9e825b32d604f6"
AFTER
"3d006e8426d1e47e4a686ebcaeb0b467da60133dc5a64f461b75c3e4e1fc7e5f"

changed /files/PRIVACY.md/size

BEFORE
1965
AFTER
6308

changed /files/README.md/sha256

BEFORE
"2b92ac9bf16012c2f8ccf972aeca5c8d9c8f3e6f039907e9336b53f3920688c8"
AFTER
"be95a8a0e4c729037059c332d7aec58f46dd0d34ba9f322f6c457aac1d18bfc9"

changed /files/README.md/size

BEFORE
10513
AFTER
13453

added /files/docs~1contract-knowledge~1README.md

BEFORE
Field was absent
AFTER
{
  "sha256": "0e93aec67b42c6df9c5728e79eed803e92282bd6ba9f46e5f601c00dd735f43c",
  "size": 2432
}

added /files/docs~1contract-knowledge~1example.knowledge.json

BEFORE
Field was absent
AFTER
{
  "sha256": "e0075b06f25636b325c97d1418746a99262214ad115d474735058c20c15895e7",
  "size": 993
}

added /files/docs~1contract-knowledge~1technical-knowledge.schema.json

BEFORE
Field was absent
AFTER
{
  "sha256": "2f924a382e20b905643ec7f1e739d67f7ec4c15775ed246371fde1c9860ac042",
  "size": 4740
}

added /files/scripts~1build_knowledge_draft.py

BEFORE
Field was absent
AFTER
{
  "sha256": "99962c4ff0484e461a54b841860f7833c742118d899b39db7cee05cfb93b990e",
  "size": 2639
}

added /files/scripts~1validate_knowledge_json.py

BEFORE
Field was absent
AFTER
{
  "sha256": "485edf99bf0f55f1dab9a42b0364a778bb453559a26101e21339aefc89fb2567",
  "size": 4215
}

added /files/tests~1test_knowledge_contract.py

BEFORE
Field was absent
AFTER
{
  "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