Update to Engineering Project OS
Snapshot Oct 1, 2026 · 06:02 UTC · version 2.2.1
Package or technical metadata updated
Package contents changed in 20 files: .codex-plugin/plugin.json, CHANGELOG.md, CONTRIBUTING.md, …. Open the file diff to inspect the edits.
Observed in package metadata. These changes alone do not establish a new customer-facing feature.
Package file
b638210097a0047b6db4d6d6d565573d69f23532e639786e242c7965aba1fdc3
ac10622ded1047e23f2b97566c855a9391507b634d8573f5d9608c4ebb30403e
Package file
4dd287b706233aae594689451b14821de18bff886a0276f27f49ef6268a1bdcb
a3dceb64ff77475e4f6836b5341cd126da45eb43dd69a96c2f8ac23d7fabe48d
Package file
12495
13206
Package file
a2b09204fa46b6e0b14e66bc14a097ad5c672a5006508adf54949deccb68d1ca
da05a671e021ee4dcd751661f0ad4b6d2e04cd5788e4fdf70baf2112c00b01f2
Compare saved observations
Download comparison JSONChanged files
skills/project-os/assets/templates/core/.agents/WORKFLOW.md →
skills/project-os/assets/templates/core/.agents/plans/README.md →
skills/project-os/evals/README.md →
skills/project-os/evals/continuity.json →
skills/project-os/evals/prepare_fixture.py →
scripts/package_plugin.py
--- before +++ after @@ -5,6 +5,9 @@ import argparse import hashlib +import importlib.util +import io +import contextlib import json import re import stat @@ -182,14 +185,57 @@ return validate_zip(output) +def validate_release_acceptance(root: Path, archive_path: Path, target: Path, plan_id: str) -> dict[str, object]: + """Read-only guard for the exact candidate, separate from ZIP consistency.""" + sources = source_files(root) + with zipfile.ZipFile(archive_path) as archive: + expected = {path.relative_to(root).as_posix(): path.read_bytes() for path in sources} + if set(archive.namelist()) != set(expected) or any( + archive.read(name) != content for name, content in expected.items() + ): + raise ValueError("NOT_READY: ZIP differs from the candidate checkout; rebuild and repeat affected acceptance") + spec = importlib.util.spec_from_file_location("project_os_release_guard", root / "skills/project-os/scripts/project_os.py") + helper = importlib.util.module_from_spec(spec) + spec.loader.exec_module(helper) + snapshots = {} + try: + with contextlib.redirect_stdout(io.StringIO()): + report = helper.plan_status_report(target.resolve(), plan_id, snapshots) + if not report["ready"]: + raise ValueError("NOT_READY: " + "; ".join(report["readiness_blockers"])) + for product in ("codex", "chatgpt"): + if not any(gate.get("evidence_class") == "host" and product in gate.get("target", "").lower() + and gate.get("status") == "verified" for gate in report["gates"]): + raise ValueError(f"NOT_READY: release acceptance requires verified {product} host evidence; a narrower source plan is insufficient") + for path, digest in snapshots.items(): + helper.reject_symlink_path(target.resolve(), path) + content, _ = helper.read_regular_at_path(path) + if hashlib.sha256(content).hexdigest() != digest: + raise ValueError("NOT_READY: acceptance inputs changed during validation") + current = {path.relative_to(root).as_posix(): path.read_bytes() for path in source_files(root)} + if current != expected: + raise ValueError("NOT_READY: candidate source changed during acceptance validation") + except helper.ProjectOSError as error: + raise ValueError("NOT_READY: " + str(error)) from error + return {"readiness": "READY", "plan_id": report["plan_id"], "outcome": report["outcome"]} + + def main() -> int: parser = argparse.ArgumentParser(description=__doc__) group = parser.add_mutually_exclusive_group(required=True) group.add_argument("--output", type=Path, help="New ZIP path; existing files are never overwritten") group.add_argument("--check", type=Path, help="Validate an existing ZIP without writes") + parser.add_argument("--acceptance-target", type=Path, help="Connected repository owning candidate acceptance; requires --check and --plan-id") + parser.add_argument("--plan-id", help="Candidate acceptance plan; requires --acceptance-target") arguments = parser.parse_args() + if bool(arguments.acceptance_target) != bool(arguments.plan_id) or arguments.acceptance_target and not arguments.check: + parser.error("Release acceptance requires --check, --acceptance-target and --plan-id together") try: result = validate_zip(arguments.check) if arguments.check else build_zip(ROOT, arguments.output) + if arguments.acceptance_target: + result["acceptance"] = validate_release_acceptance(ROOT, arguments.check, arguments.acceptance_target, arguments.plan_id) + else: + result["acceptance"] = "NOT_EVALUATED: package consistency only; not release readiness" except (OSError, ValueError, KeyError, zipfile.BadZipFile) as error: parser.exit(2, f"Package validation failed: {error}\n") print(json.dumps(result, indent=2))
Full technical diff · 34 changed fields
changed /files/.codex-plugin~1plugin.json/sha256
"b638210097a0047b6db4d6d6d565573d69f23532e639786e242c7965aba1fdc3"
"ac10622ded1047e23f2b97566c855a9391507b634d8573f5d9608c4ebb30403e"
changed /files/CHANGELOG.md/sha256
"4dd287b706233aae594689451b14821de18bff886a0276f27f49ef6268a1bdcb"
"a3dceb64ff77475e4f6836b5341cd126da45eb43dd69a96c2f8ac23d7fabe48d"
changed /files/CHANGELOG.md/size
12495
13206
changed /files/CONTRIBUTING.md/sha256
"a2b09204fa46b6e0b14e66bc14a097ad5c672a5006508adf54949deccb68d1ca"
"da05a671e021ee4dcd751661f0ad4b6d2e04cd5788e4fdf70baf2112c00b01f2"
changed /files/README.md/sha256
"76a8d8e8d43c54f449256cc5df6aa6c30fa9ac4843c8329b4df28d11fbd457c1"
"e2aac6a6cf45128656c65eb129677d0d496dbb3cbb9e155658d714b606c75151"
changed /files/SECURITY.md/sha256
"015e1a1f57439dd56a9ca24d8b77cfb3fb99528827e79a9fa23a3b1884d22a9a"
"6a495783ee32df9721e1098b1fa7c2d39bf9d0a72f1e7c333a5548ee503e17d5"
changed /files/docs~1HOW_IT_WORKS.md/sha256
"6d09395213d8c70fb6bcc60914748149e953e373a889cf338c7363dd483b273c"
"2a6ad756b78af53684706c45b5e087d3696b500a1fe70dee7c60ac7f80a9e752"
changed /files/docs~1HOW_IT_WORKS.md/size
12008
12555
changed /files/docs~1PACKAGING.md/sha256
"9b5f1e8e49f395038468e3e900af66a8ad9a2a6479cd3f0a38d435a7966ed10d"
"eb17c8a66fd19629211aef8d791562e72545aca89adebc8f85ba38432be8fe61"
changed /files/docs~1PACKAGING.md/size
8624
10173
changed /files/docs~1REFERENCE.md/sha256
"1e5df423adc182c534976979322109eb284fb5c01606ebd99590c31a1a36e162"
"90f1a19c5076eda06f966681327d4fb265c0a68198ab0882fa55818f5486aa31"
changed /files/docs~1REFERENCE.md/size
37854
38447
changed /files/docs~1SETUP.md/sha256
"4687f649071fd03166e61f3270be6de5f158daff9e483809a407b057f086dbd5"
"dc2972c71f9ff3e3ea94cb17b4fee8aab932c418cca7ee071f948c832f1c4813"
changed /files/docs~1USAGE.md/sha256
"78adb0d227c5c2570be9620369accd671584387a26b8ee1a74104da582636f2c"
"6ec3094c2ad0983ebc40e9520256100ab02725b31a90fd48e5e1c3f87273cbc7"
changed /files/docs~1USAGE.md/size
11892
12447
changed /files/plugin.json/sha256
"4ddd7707aea56f9db75884bb364a2eb3ee03b97d02384f9686d52dc20c85a676"
"a39e5e2c9b409f8b0f3ffb4f2d60f05e019699e71de2b53bec57553f4cb6a854"
changed /files/scripts~1package_plugin.py/sha256
"b57ba4a39b31b5a6ddeaba852f72f327436cefcc1c5dc39ed4cbb469917e91af"
"230b287aa5a8ceebbc116a38a0186ed23e56c88ca1d15f1c4870f48e0158a085"
changed /files/scripts~1package_plugin.py/size
9815
12927
changed /files/skills~1project-os~1SKILL.md/sha256
"3e3a1f5f6520cb9dac492318683f3b7e3d61e1992aaae10a66dbb6b0ef9d6066"
"be17df5c74064e75040ca1ae2ff8fffd74d40e6b6f632f00f5375edd276b0f5a"
changed /files/skills~1project-os~1SKILL.md/size
10690
10986
changed /files/skills~1project-os~1assets~1templates~1core~1.agents~1WORKFLOW.md/sha256
"2bb4a630199a43bd5dbec13f78be768c6af7fbfc628811fc9cf8a6bbd12819ee"
"f7f5536b20f639375e40e29036a1e238c814487f1880ac6fd4f46c0c689b733a"
changed /files/skills~1project-os~1assets~1templates~1core~1.agents~1WORKFLOW.md/size
4374
8050
changed /files/skills~1project-os~1assets~1templates~1core~1.agents~1plans~1README.md/sha256
"0619bc7d55f3be473efd4a3c691e46566f14dd10df1c99b9aeb40defd2c5a7f1"
"605c6829a0b5a2f6e76146ccfac00cc712bdca8cdf109dc6bfbcfc18c48a1e7c"
changed /files/skills~1project-os~1assets~1templates~1core~1.agents~1plans~1README.md/size
3137
3707
changed /files/skills~1project-os~1evals~1README.md/sha256
"b49c996d112eb2bbaa5c6760a2bb07167ff4b67ee16137e4d7e8f861e59d8c56"
"08e91e553ad39a7e8232d4abe1d6b04f8b3fe705294ffc58faa993192b8b60b4"
changed /files/skills~1project-os~1evals~1README.md/size
6249
6691
changed /files/skills~1project-os~1evals~1continuity.json/sha256
"aa95e2f9d92d6cfbee8fade60fbc14f8c2b21119a04ce686b48403f45eb465cb"
"422f9f58bf9fed1e4cef30530fbe8575f5608d06ba96856e2563d111e74eec9f"
changed /files/skills~1project-os~1evals~1continuity.json/size
6883
8009
changed /files/skills~1project-os~1evals~1prepare_fixture.py/sha256
"57a2bcc80c74e07598a47fc00bdaaa6ec0574af515688ac10586ea37cc5d37ad"
"cf48d253631705601cc1c982f3d343024b67da4e61ed1509eaac97f976024df1"
changed /files/skills~1project-os~1evals~1prepare_fixture.py/size
13516
14954
changed /files/skills~1project-os~1references~1maintenance.md/sha256
"a7bf0c1d23a91e5fbfec9a8fbdd79fdf50fe62f0c90753bdcd30d4108e461fc1"
"361af51bb0dc3b26998edbffd60c76d7acd2f68d43c29e09bc7296ce2b29e20d"
changed /files/skills~1project-os~1references~1maintenance.md/size
12232
12962
changed /files/skills~1project-os~1scripts~1project_os.py/sha256
"3641e1797e5617d3aa7243f265dbacab224b51ed9257ce64aae734d14bcab73f"
"261cac5822863e8d52383affb6f915a4e5b0a955a7d891d1a62cf1a994df3809"
changed /files/skills~1project-os~1scripts~1project_os.py/size
258291
258974
Full snapshot data
{
"files": {
"LICENSE": {
"size": 1081,
"sha256": "2b5277a87aa3ff5fa8bf0155b36a1e7f6c2c5e099123fd5666436352670b129e"
},
"README.md": {
"size": 9690,
"sha256": "e2aac6a6cf45128656c65eb129677d0d496dbb3cbb9e155658d714b606c75151"
},
"SECURITY.md": {
"size": 6012,
"sha256": "6a495783ee32df9721e1098b1fa7c2d39bf9d0a72f1e7c333a5548ee503e17d5"
},
"plugin.json": {
"size": 2734,
"sha256": "a39e5e2c9b409f8b0f3ffb4f2d60f05e019699e71de2b53bec57553f4cb6a854"
},
"CHANGELOG.md": {
"size": 13206,
"sha256": "a3dceb64ff77475e4f6836b5341cd126da45eb43dd69a96c2f8ac23d7fabe48d"
},
"docs/SETUP.md": {
"size": 6865,
"sha256": "dc2972c71f9ff3e3ea94cb17b4fee8aab932c418cca7ee071f948c832f1c4813"
},
"docs/TERMS.md": {
"size": 1918,
"sha256": "d900fa8cb94916a77e646eca74db7a6d972379e1b671b4792786291f12858c4d"
},
"docs/USAGE.md": {
"size": 12447,
"sha256": "6ec3094c2ad0983ebc40e9520256100ab02725b31a90fd48e5e1c3f87273cbc7"
},
"CONTRIBUTING.md": {
"size": 7734,
"sha256": "da05a671e021ee4dcd751661f0ad4b6d2e04cd5788e4fdf70baf2112c00b01f2"
},
"assets/icon.svg": {
"size": 641,
"sha256": "320ef870116057315ea41f8015064f69666beb37f6a0dbbb0b46f08612976f4c"
},
"assets/logo.svg": {
"size": 643,
"sha256": "9e73a9b4c30c8ddf8056da1ae6258ef50a42c6a5b2b9fe9222cec613612f83cd"
},
"docs/PRIVACY.md": {
"size": 2389,
"sha256": "8196e7a8dd005f8e63c3ae70e7c5387bb5c9e6b343a92a6edd26084927d1588f"
},
"docs/PACKAGING.md": {
"size": 10173,
"sha256": "eb17c8a66fd19629211aef8d791562e72545aca89adebc8f85ba38432be8fe61"
},
"docs/REFERENCE.md": {
"size": 38447,
"sha256": "90f1a19c5076eda06f966681327d4fb265c0a68198ab0882fa55818f5486aa31"
},
"docs/HOW_IT_WORKS.md": {
"size": 12555,
"sha256": "2a6ad756b78af53684706c45b5e087d3696b500a1fe70dee7c60ac7f80a9e752"
},
".codex-plugin/plugin.json": {
"size": 2530,
"sha256": "ac10622ded1047e23f2b97566c855a9391507b634d8573f5d9608c4ebb30403e"
},
"assets/social-preview.png": {
"size": 48952,
"sha256": "464a52ca13f2be4531c19db996ec0adad6080b6a04d828c7660c2e3a5c3eaf42"
},
"assets/social-preview.svg": {
"size": 2914,
"sha256": "eebe9d47501e2f3a8d13213e3a5e55c77446af0c268da48cd7fe3d5d95b49c70"
},
"scripts/package_plugin.py": {
"size": 12927,
"sha256": "230b287aa5a8ceebbc116a38a0186ed23e56c88ca1d15f1c4870f48e0158a085"
},
"skills/project-os/SKILL.md": {
"size": 10986,
"sha256": "be17df5c74064e75040ca1ae2ff8fffd74d40e6b6f632f00f5375edd276b0f5a"
},
".codex-plugin/assets/logo.svg": {
"size": 643,
"sha256": "9e73a9b4c30c8ddf8056da1ae6258ef50a42c6a5b2b9fe9222cec613612f83cd"
},
"skills/project-os/evals/README.md": {
"size": 6691,
"sha256": "08e91e553ad39a7e8232d4abe1d6b04f8b3fe705294ffc58faa993192b8b60b4"
},
"skills/project-os/agents/openai.yaml": {
"size": 375,
"sha256": "6c2451a360c5b897d925249cd1063fcfa0ae6ce20d0c5356a9298d999e3e60e0"
},
"skills/project-os/evals/prompts.json": {
"size": 11869,
"sha256": "11f8ebe82f718731e10bedbad201eaa7bd67454bd34ca103bf528cd18059817d"
},
"skills/project-os/assets/packs/web.md": {
"size": 850,
"sha256": "b7c14b078bc66311f7602c93127445ea9c70eec73902c9e77f7e2e7a41ecb597"
},
".codex-plugin/assets/composer-icon.svg": {
"size": 641,
"sha256": "320ef870116057315ea41f8015064f69666beb37f6a0dbbb0b46f08612976f4c"
},
"skills/project-os/assets/packs/data.md": {
"size": 833,
"sha256": "b785ef2be863917ea1b52abcb5e62d5fea29342ec3f913433b7773bfd636de02"
},
"skills/project-os/evals/discovery.json": {
"size": 8010,
"sha256": "3ab4177f0fc993d825c4e1db814e8e71f229f2942798b8729c00b2c7ebf78652"
},
"skills/project-os/assets/icon-large.svg": {
"size": 643,
"sha256": "9e73a9b4c30c8ddf8056da1ae6258ef50a42c6a5b2b9fe9222cec613612f83cd"
},
"skills/project-os/assets/icon-small.svg": {
"size": 641,
"sha256": "320ef870116057315ea41f8015064f69666beb37f6a0dbbb0b46f08612976f4c"
},
"skills/project-os/evals/continuity.json": {
"size": 8009,
"sha256": "422f9f58bf9fed1e4cef30530fbe8575f5608d06ba96856e2563d111e74eec9f"
},
"skills/project-os/evals/submission.json": {
"size": 13959,
"sha256": "cc2285a755802641d990775f3f71ea81259f7bf7669c559fd44b62aa9ec3d98d"
},
"skills/project-os/scripts/project_os.py": {
"size": 258974,
"sha256": "261cac5822863e8d52383affb6f915a4e5b0a955a7d891d1a62cf1a994df3809"
},
"skills/project-os/assets/packs/README.md": {
"size": 1028,
"sha256": "256c78e384ac70756c8192a7d1dae5449de59b86306c83bed2441a55a766cc2f"
},
"skills/project-os/assets/packs/mobile.md": {
"size": 966,
"sha256": "75653f85bcc653c6d138e1c1821e7bc768d8c85754ee1c100beb42c3c7bbc04d"
},
"skills/project-os/assets/packs/service.md": {
"size": 797,
"sha256": "c9846ee0d6509812dc49b4b3d7ac7b161722f3c6fb5acbf8378daca2d5fea8d6"
},
"skills/project-os/references/bootstrap.md": {
"size": 5075,
"sha256": "0c9d373b65d1580a2addee2670e81cddf280559efed12ebc98cf4d31a8a600e1"
},
"skills/project-os/references/knowledge.md": {
"size": 7194,
"sha256": "dac351ed896a1ab6640bf5e27e3cc74da836a97e2174abb7397ed242fcae94ae"
},
"skills/project-os/assets/packs/delivery.md": {
"size": 829,
"sha256": "61e4974af6c36377f75f5d5a80a7a9c81b39b1812c56f32205d4076a89336bb6"
},
"skills/project-os/evals/prepare_fixture.py": {
"size": 14954,
"sha256": "cf48d253631705601cc1c982f3d343024b67da4e61ed1509eaac97f976024df1"
},
"skills/project-os/references/maintenance.md": {
"size": 12962,
"sha256": "361af51bb0dc3b26998edbffd60c76d7acd2f68d43c29e09bc7296ce2b29e20d"
},
"skills/project-os/assets/templates/core/AGENTS.md": {
"size": 4493,
"sha256": "0576e6320fe2f81eab635a234606c25625e5ecdfa6ae8f26b341a38c2bd8df70"
},
"skills/project-os/assets/templates/program/PROGRAM.md": {
"size": 561,
"sha256": "02ef62d5362b0362b6533bcde4ba84c3452d796667f0a63686045fe21b5b0127"
},
"skills/project-os/assets/overlays/react-native-expo.md": {
"size": 1035,
"sha256": "f3842aa1b10fabbed1651d0ef9ed857f2a6577d63f4e74fe2d97a56752bb254b"
},
"skills/project-os/assets/templates/core/.agents/STATE.md": {
"size": 739,
"sha256": "deb7de342922767e6d5d9dc35545195693dbc5115d0e8c28edf5782b0b32daaf"
},
"skills/project-os/assets/templates/core/.agents/README.md": {
"size": 1833,
"sha256": "cf747afe6237402ccebde9a2ec322752d6724d9e662dadb673cf3e83a2d8ad2a"
},
"skills/project-os/assets/templates/core/.agents/CONTEXT.md": {
"size": 1096,
"sha256": "cac7e22dcb6bf3dd2fe32abbd6726ba3f8e96bfcd2e096ccbc5f593776b2fa02"
},
"skills/project-os/assets/templates/core/.agents/WORKFLOW.md": {
"size": 8050,
"sha256": "f7f5536b20f639375e40e29036a1e238c814487f1880ac6fd4f46c0c689b733a"
},
"skills/project-os/assets/templates/program/history/README.md": {
"size": 417,
"sha256": "5545722071313de97efc9311065e2979b1bbf7e87baa177d10e3af0328c530f8"
},
"skills/project-os/assets/templates/core/.agents/requests.json": {
"size": 60,
"sha256": "f6942bd914e9ada67b56aaccec14d4da9e4806888f5c265cee6e6018315c8935"
},
"skills/project-os/assets/templates/core/.agents/plans/README.md": {
"size": 3707,
"sha256": "605c6829a0b5a2f6e76146ccfac00cc712bdca8cdf109dc6bfbcfc18c48a1e7c"
},
"skills/project-os/assets/templates/core/.agents/plans/index.json": {
"size": 138,
"sha256": "bde14cb71b0a712b1fc338ecf98432bbc4babe4e0ed8930066c6c9fc8b4144a2"
},
"skills/project-os/assets/templates/core/.agents/evidence/README.md": {
"size": 420,
"sha256": "6d7305c99da57a53658b2e10d3d0a01bc0b96c0452f7d139feeba42554860c09"
},
"skills/project-os/assets/templates/core/.agents/findings/README.md": {
"size": 513,
"sha256": "da004b9622fd04e37b073cc744298d050fc21cfda33ee6a5826f617fc5ad47a4"
},
"skills/project-os/assets/templates/core/.agents/knowledge/README.md": {
"size": 547,
"sha256": "982e8d55715ae97ae94de270c51ad86cdc1c4de50a25152e21673471f6e3afa2"
},
"skills/project-os/assets/templates/core/.agents/findings/findings.json": {
"size": 60,
"sha256": "10eaf276f6fa7c4d4fcb45d0dc4d45f8a0566531d8c7c7ebbe6973534777f09a"
},
"skills/project-os/assets/templates/core/.agents/knowledge/project/failures.json": {
"size": 76,
"sha256": "7ce7bfa8f4813891b7883be037071b81afa56ecef5901a8cb25c61b201f46f82"
},
"skills/project-os/assets/templates/core/.agents/knowledge/reusable/failures.json": {
"size": 43,
"sha256": "406e9052d7c5782d0e70febbe2a12d5a9e72046854bdac2684c4c7909900ddc3"
}
}
}SHA-256: 82edfc48a5e8c39ffd637710d222a0694aa5378800066b120ecab2958892a2d1