← Engineering Project OSCONTENT HISTORY

Update to Engineering Project OS

Snapshot Nov 3, 2026 · 06:11 UTC · version 2.3.0

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 Engineering Project OS 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

Oct 24, 2026 · 13:23 UTC

d487557331b74989ac13a90bcbb8cdcb27e8c202599e3b1f78c81c8718fdc1bc

After

Nov 3, 2026 · 06:11 UTC

964a70c3ee9557317874096587789d2888ea6ecd7281245c0da3731456c249f2

Package file

Before

Oct 24, 2026 · 13:23 UTC

ee3411d4c27efadc09348fe329d1be184f87525828def9fec344955c2a8c57c8

After

Nov 3, 2026 · 06:11 UTC

fd58d7245a98a676c07e45ad9127f10260556b4b7daf3c9ea100c19c86402916

Package file

Before

Oct 24, 2026 · 13:23 UTC

17915

After

Nov 3, 2026 · 06:11 UTC

21328

Package file

Before

Oct 24, 2026 · 13:23 UTC

94b36220889a83e481fbb29ed7a71e8e6035e45103a10b9a157e1210b980e6b3

After

Nov 3, 2026 · 06:11 UTC

73b7d4ae913de6dc39d396c3a79b31b7c5c7b4851cb51bd3cef51f26da78b223

Compare saved observations

Download comparison JSON

scripts/check_codex_review.py

− removed · + added

--- before
+++ after
@@ -16,6 +16,7 @@
     raise SystemExit(1)
 
 import argparse
+import datetime
 import hashlib
 import json
 import os
@@ -30,6 +31,32 @@
 BOT_GRAPHQL = "chatgpt-codex-connector"
 SUMMARY_MARKER = "<!-- codex-pull-request-review-summary -->"
 STATE_PATTERN = re.compile(r"<!-- codex-review-state:v1 (.*?) -->", re.DOTALL)
+RECEIPT_MARKER = "<!-- codex-review-receipt:v1 -->"
+# Accept only the observed affirmative Security receipt, not generic review text.
+# An unknown provider template fails closed until independently reviewed.
+SECURITY_RECEIPT_PATTERN = re.compile(re.escape(RECEIPT_MARKER + """
+
+### 🛡️ Codex Security Review · _Automatically triggered_
+
+Security review completed. No security issues were found in this pull request.
+
+**Reviewed commit:** `""") + r"(?P<head>[0-9a-f]{10,40})" + re.escape("""`
+
+[View security finding report](https://chatgpt.com/codex/cloud/tasks/task_e_""") + r"[0-9a-f]{32}" + re.escape(""")
+
+_Only the user who started this review can view the report in Codex._
+
+<details> <summary>ℹ️ About Codex security reviews in GitHub</summary>
+<br/>
+
+This is an experimental Codex feature. Security reviews are triggered when:
+- You comment "@codex security review"
+- A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review
+
+Once complete, Codex will leave suggestions, or a comment if no findings are found.
+
+
+</details>"""))
 FINDING_MARKERS = {
     "<!-- codex-code-review-finding:v1 -->": "code_review",
     "<!-- codex-security-review-finding:v1 -->": "security_review",
@@ -48,7 +75,7 @@
       comments { totalCount }
       reviews(first:100) {
         totalCount pageInfo { hasNextPage hasPreviousPage }
-        nodes { id state submittedAt author { __typename login } commit { oid } }
+        nodes { id state body submittedAt lastEditedAt author { __typename login } commit { oid } }
       }
       reviewThreads(first:100) {
         totalCount pageInfo { hasNextPage hasPreviousPage }
@@ -112,6 +139,67 @@
             and author.get("login") in (BOT_GRAPHQL, BOT))
 
 
+def rest_bot(comment):
+    return (isinstance(comment, dict) and isinstance(comment.get("user"), dict)
+            and comment["user"].get("login") == BOT and comment["user"].get("type") == "Bot")
+
+
+def api_time(value, label):
+    require(isinstance(value, str) and re.fullmatch(r"[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z", value),
+            label + ": unknown timestamp")
+    try:
+        return datetime.datetime.strptime(value, "%Y-%m-%dT%H:%M:%SZ")
+    except ValueError as error:
+        raise NotReady(label + ": invalid timestamp") from error
+
+
+def latest_security_receipt(comments):
+    receipts = []
+    for comment in comments:
+        body = comment.get("body")
+        if not (rest_bot(comment) and isinstance(body, str)) or SUMMARY_MARKER in body:
+            continue
+        # Classify Security activity before checking its receipt format. A newer
+        # dirty/running result with a changed or absent marker must supersede the
+        # old clean receipt and fail the exact-template check, never disappear.
+        if re.search(r"\bsecurity\b", body, re.IGNORECASE):
+            receipts.append((api_time(comment.get("updated_at"), "Security receipt"), comment))
+        elif "<!-- codex-review-receipt" in body:
+            require(re.search(r"(?m)^Codex Review:", body), "Unknown canonical review receipt; inspect the provider format")
+    require(receipts, "Missing canonical clean Security receipt for unknown summary finding flags")
+    latest = max(item[0] for item in receipts)
+    selected = [comment for timestamp, comment in receipts if timestamp == latest]
+    require(len(selected) == 1, "Latest Security receipt is ambiguous")
+    return selected[0]
+
+
+def explicit_null_security(state):
+    return (isinstance(state, dict) and "has_any_findings" in state and "has_unresolved_findings" in state
+            and state["has_any_findings"] is None and state["has_unresolved_findings"] is None)
+
+
+def clean_security_evidence(snapshot, comments, summary, pr, canonical, head):
+    receipt = latest_security_receipt(comments)
+    require(receipt.get("html_url") == pr["url"] + "#issuecomment-" + str(receipt["id"]),
+            "Noncanonical Security receipt URL")
+    created = api_time(receipt.get("created_at"), "Security receipt creation")
+    completed = api_time(receipt.get("updated_at"), "Security receipt update")
+    require(created == completed <= api_time(summary.get("updated_at"), "Summary update")
+            <= api_time(pr.get("updatedAt"), "PR update"), "Security receipt was edited or is newer than the summary/PR")
+    match = SECURITY_RECEIPT_PATTERN.fullmatch(receipt["body"])
+    require(match is not None, "Latest Security receipt is not a supported affirmative clean completion")
+    reference = match.group("head")
+    commits = snapshot.get("receipt_commits")
+    require(isinstance(commits, dict) and set(commits) == {reference}, "Missing or ambiguous Security receipt commit resolution")
+    commit = commits[reference]
+    require(isinstance(commit, dict) and commit.get("sha") == head and head.startswith(reference)
+            and commit.get("html_url") == "https://github.com/{}/commit/{}".format(canonical, head),
+            "Security receipt commit does not resolve to the exact final head")
+    return {"source": "canonical_clean_receipt", "url": receipt["html_url"],
+            "body_sha256": digest(receipt["body"].encode("utf-8")), "reviewed_head": head,
+            "completed_at": receipt["updated_at"], "has_any_findings": None, "has_unresolved_findings": None}
+
+
 def inspect_review(snapshot, repository, number, head):
     """Validate complete API data; this function performs no network or writes."""
     require(isinstance(snapshot, dict), "Missing API snapshot")
@@ -138,8 +226,7 @@
             and len(set(ids)) == len(ids), "Issue comments: missing or duplicate IDs")
     summaries = [comment for comment in comments
                  if isinstance(comment.get("body"), str) and SUMMARY_MARKER in comment["body"]
-                 and comment.get("user", {}).get("login") == BOT
-                 and comment.get("user", {}).get("type") == "Bot"]
+                 and rest_bot(comment)]
     require(summaries, "Missing trusted Codex bot summary; wait for the exact-head code and security reviews")
     require(all(isinstance(item.get("updated_at"), str) for item in summaries), "Unknown summary timestamp")
     summary = max(summaries, key=lambda item: (item["updated_at"], item["id"]))
@@ -149,14 +236,21 @@
     require(len(markers) == 1, "Missing, duplicate or unknown Codex summary state marker")
     states = strict_json(markers[0])
     require(isinstance(states, dict), "Unknown Codex summary state")
+    review_evidence = {}
     for kind in ("code_review", "security_review"):
         state = states.get(kind)
         require(isinstance(state, dict) and state.get("commit_sha") == head,
                 kind + ": missing or wrong reviewed head; request review of the final SHA")
         require(state.get("status") == "completed", kind + ": not completed; wait for review")
-        require(type(state.get("has_any_findings")) is bool
-                and state.get("has_unresolved_findings") is False,
-                kind + ": unknown or unresolved findings; triage and refresh the final-head review")
+        if kind == "security_review" and explicit_null_security(state):
+            review_evidence[kind] = clean_security_evidence(snapshot, comments, summary, pr, canonical, head)
+        else:
+            require(type(state.get("has_any_findings")) is bool
+                    and state.get("has_unresolved_findings") is False,
+                    kind + ": unknown or unresolved findings; triage and refresh the final-head review")
+            review_evidence[kind] = {"source": "summary_flags", "url": summary["html_url"],
+                                     "reviewed_head": head, "has_any_findings": state["has_any_findings"],
+                                     "has_unresolved_findings": state["has_unresolved_findings"]}
     for review in connection(pr.get("reviews"), "Reviews"):
         if graphql_bot(review.get("author")):
             require(review.get("state") in ("APPROVED", "COMMENTED", "DISMISSED", "CHANGES_REQUESTED"),
@@ -165,6 +259,20 @@
             require(not (review.get("commit", {}).get("oid") == head
                          and review.get("state") == "CHANGES_REQUESTED"),
                     "Final-head Codex review still requests changes")
+            security = review_evidence["security_review"]
+            if security["source"] == "canonical_clean_receipt":
+                body = review.get("body")
+                require(isinstance(body, str), "Receipt fallback needs complete canonical review-submission bodies")
+                submitted = api_time(review.get("submittedAt"), "Codex review submission")
+                require("lastEditedAt" in review, "Receipt fallback needs the canonical review body edit timestamp")
+                edited = review["lastEditedAt"]
+                activity = max(submitted, api_time(edited, "Codex review body edit")) if edited is not None else submitted
+                require(activity <= api_time(pr.get("updatedAt"), "PR update"), "Codex review activity is newer than the PR")
+                known_code = (body.startswith(RECEIPT_MARKER) and body.count(RECEIPT_MARKER) == 1
+                              and re.search(r"(?m)^### 💡 Codex Review$|^Codex Review:", body)
+                              and not re.search(r"\bsecurity\b", body, re.IGNORECASE))
+                require(activity <= api_time(security["completed_at"], "Security receipt update") or known_code,
+                        "Newer Security or unclassified review submission supersedes the clean receipt; refresh review")
     findings = {}
     current_kinds = set()
     for thread in connection(pr.get("reviewThreads"), "Review threads"):
@@ -196,12 +304,17 @@
                 re.escape(pr["url"]) + r"#discussion_r[0-9]+", url), "Noncanonical finding URL")
             require(url not in findings, "Duplicate finding URL")
             findings[url] = comment
+            if kinds[0] == "security_review" and review_evidence["security_review"]["source"] == "canonical_clean_receipt":
+                require(api_time(comment.get("updatedAt"), "Security finding update")
+                        <= api_time(review_evidence["security_review"]["completed_at"], "Security receipt update"),
+                        "Security finding changed after the clean receipt; refresh the final-head review")
             if comment.get("commit", {}).get("oid") == head:
                 current_kinds.add(kinds[0])
     for kind in ("code_review", "security_review"):
-        require(not states[kind]["has_any_findings"] or kind in current_kinds,
+        require(states[kind]["has_any_findings"] is not True or kind in current_kinds,
                 kind + ": summary findings are absent from the complete thread data")
-    return {"findings": findings, "summary_url": summary.get("html_url"), "states": states}
+    return {"findings": findings, "summary_url": summary.get("html_url"), "states": states,
+            "review_evidence": review_evidence}
 
 
 def evidence_file(target, relative):
@@ -353,8 +466,26 @@
         pages = strict_json(self.command([self.tools["gh"], "api", "--hostname", "github.com", "--paginate", "--slurp",
                                          "repos/{}/issues/{}/comments?per_page=100".format(repository, number)]))
         require(isinstance(pages, list) and all(isinstance(page, list) for page in pages), "Unknown issue-comment pagination response")
+        comments = [comment for page in pages for comment in page]
+        snapshot = {"graphql": graph, "issue_comments": comments}
+        summaries = [comment for comment in comments if rest_bot(comment)
+                     and isinstance(comment.get("body"), str) and SUMMARY_MARKER in comment["body"]]
+        if summaries and all(isinstance(comment.get("updated_at"), str) for comment in summaries):
+            summary = max(summaries, key=lambda item: (item["updated_at"], item["id"]))
+            markers = STATE_PATTERN.findall(summary["body"])
+            states = strict_json(markers[0]) if len(markers) == 1 else None
+            security = states.get("security_review") if isinstance(states, dict) else None
+            if explicit_null_security(security):
+                receipt = latest_security_receipt(comments)
+                match = SECURITY_RECEIPT_PATTERN.fullmatch(receipt["body"])
+                require(match is not None, "Latest Security receipt is not a supported affirmative clean completion")
+                reference = match.group("head")
+                commit = strict_json(self.command([self.tools["gh"], "api", "--hostname", "github.com",
+                    "repos/{}/commits/{}".format(repository, reference)]))
+                require(isinstance(commit, dict), "Unknown receipt commit resolution response")
+                snapshot["receipt_commits"] = {reference: {key: commit.get(key) for key in ("sha", "html_url")}}
         self.verify_tools()
-        return {"graphql": graph, "issue_comments": [comment for page in pages for comment in page]}
+        return snapshot
 
     def source(self, target):
         target = target.resolve()
@@ -411,6 +542,7 @@
     return {"readiness": "READY", "repository": repository, "pr": number, "reviewed_head": head,
             "code_review": "completed", "security_review": "completed", "findings": len(result["findings"]),
             "unresolved_threads": 0, "summary_url": result["summary_url"],
+            "review_evidence": result["review_evidence"],
             "tools": tools,
             "scope": "Recorded exact-head Codex reviews, resolved threads and hash-bound dispositions; CI and semantic evidence assessment remain separate."}
 
Full technical diff · 45 changed fields

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

BEFORE
"d487557331b74989ac13a90bcbb8cdcb27e8c202599e3b1f78c81c8718fdc1bc"
AFTER
"964a70c3ee9557317874096587789d2888ea6ecd7281245c0da3731456c249f2"

changed /files/CHANGELOG.md/sha256

BEFORE
"ee3411d4c27efadc09348fe329d1be184f87525828def9fec344955c2a8c57c8"
AFTER
"fd58d7245a98a676c07e45ad9127f10260556b4b7daf3c9ea100c19c86402916"

changed /files/CHANGELOG.md/size

BEFORE
17915
AFTER
21328

changed /files/CONTRIBUTING.md/sha256

BEFORE
"94b36220889a83e481fbb29ed7a71e8e6035e45103a10b9a157e1210b980e6b3"
AFTER
"73b7d4ae913de6dc39d396c3a79b31b7c5c7b4851cb51bd3cef51f26da78b223"

changed /files/CONTRIBUTING.md/size

BEFORE
8642
AFTER
9634

changed /files/README.md/sha256

BEFORE
"7977a83f2221456b48c070737048dda8c32b8eca63e1f89745cfc8b1f8ee326b"
AFTER
"09805879825282fe758dd1522b3b700e459b4e5b01f6d7b25a80471a3fe755da"

changed /files/README.md/size

BEFORE
11635
AFTER
7158

changed /files/SECURITY.md/sha256

BEFORE
"1bab4538644615e7b47e36e9879fa28983a3aedc7c8c7a4590b77d14e4fd6f45"
AFTER
"d9a0de14687f9c71d156d53019b72f5c765aa0945c7c2f7cafaedde154aa397a"

changed /files/SECURITY.md/size

BEFORE
6359
AFTER
6511

changed /files/docs~1HOW_IT_WORKS.md/sha256

BEFORE
"6718c2aed368d943b54582d93931b0af11ecec6d14adf637a0e942148f813d0e"
AFTER
"6b59b13ea46aef256483d366ece76cbf517bdd20411b0bdd8a5d1cc91c822173"

changed /files/docs~1HOW_IT_WORKS.md/size

BEFORE
14975
AFTER
5773

changed /files/docs~1PACKAGING.md/sha256

BEFORE
"cfc8c0377706ffd5505c65e798b5012880a3969e9e6ec1ad155ad68a0f489f6c"
AFTER
"b2a2d2f57ccc992018ba504ee0bbd1609cca7bb58723267865df011efe3d4adf"

changed /files/docs~1PACKAGING.md/size

BEFORE
21907
AFTER
27884

changed /files/docs~1PRIVACY.md/sha256

BEFORE
"8196e7a8dd005f8e63c3ae70e7c5387bb5c9e6b343a92a6edd26084927d1588f"
AFTER
"1ed53959c1723ddddd94ec167a5fd60365fc2db1e6daa4be3a11fd6542a6ad81"

changed /files/docs~1PRIVACY.md/size

BEFORE
2389
AFTER
2785

changed /files/docs~1REFERENCE.md/sha256

BEFORE
"7917ea8ae9bb4a359c0e7068b8260f604fd9e62f84e09270a69c9c94f295c205"
AFTER
"8769bbadb95ece8ec94746500708c5d9b41b111cbe9e545b3d2bb2a59a8543be"

changed /files/docs~1REFERENCE.md/size

BEFORE
45683
AFTER
54567

changed /files/docs~1SETUP.md/sha256

BEFORE
"f3247394e05cc1be13794807c88f37c5c95b30946720be8d34ac3ce98c7e1d5b"
AFTER
"cdd61c87ddd33af407721a5ea58d03440882aa2ef09f4c8f54b10066e3f0d78e"

changed /files/docs~1SETUP.md/size

BEFORE
10373
AFTER
7926

changed /files/docs~1USAGE.md/sha256

BEFORE
"32fc4670c4c3156d0aa3c34b70a39e1503f15509c1f2305c2b1c4b9620785c9f"
AFTER
"5ca293b9ab2e7d78826e1401f1547d7e942cf4f4208ccf495adf5909aeec0ee5"

changed /files/docs~1USAGE.md/size

BEFORE
16614
AFTER
10354

changed /files/plugin.json/sha256

BEFORE
"a78f2e8405ea19efc1f3b8f69e61b2c59340f450fadc49b56feba1e691ff2b89"
AFTER
"9457aff3398b62d4f7f8ee9ebb7427cb8a92fea22467f566a01c42fddb600437"

changed /files/scripts~1check_codex_review.py/sha256

BEFORE
"34582976581a5dc8ef4d88187965b49023ceeca3057711186b7f209888cfeecf"
AFTER
"9a19981b9a6775f5b420a20ff25034dd76957e4597bb8453c97e7ce843482e77"

changed /files/scripts~1check_codex_review.py/size

BEFORE
25187
AFTER
33589

changed /files/skills~1project-os~1SKILL.md/sha256

BEFORE
"7f884b2613e0eac3dd7a9b34345b8d9c25778d41a61eac6268323799c0cb63b4"
AFTER
"b2bc73471dd4731b8674be6983398606af9973389123374f436c51a5963f5626"

changed /files/skills~1project-os~1SKILL.md/size

BEFORE
14525
AFTER
19806

changed /files/skills~1project-os~1assets~1templates~1core~1.agents~1WORKFLOW.md/sha256

BEFORE
"f6af58603c0b52d0c4ccce595776f3b326e67f9f9e6981ab21f9a8ebb1c1175f"
AFTER
"eb6b9ff8063c201059edb2d305d01028d75f7ae503ca0993bc2bd935b4db6d30"

changed /files/skills~1project-os~1assets~1templates~1core~1.agents~1WORKFLOW.md/size

BEFORE
16307
AFTER
21145

changed /files/skills~1project-os~1assets~1templates~1core~1AGENTS.md/sha256

BEFORE
"58aa0b9d0eb9dd09ed252e8283e5897b9c4bcf5f0805c113adf1e245e623f590"
AFTER
"e3c910d1fb74dca2f79ad45f26d5aefe384bc46ba83d2fdf15e6d981a8af644d"

changed /files/skills~1project-os~1assets~1templates~1core~1AGENTS.md/size

BEFORE
4978
AFTER
5798

changed /files/skills~1project-os~1evals~1README.md/sha256

BEFORE
"08e91e553ad39a7e8232d4abe1d6b04f8b3fe705294ffc58faa993192b8b60b4"
AFTER
"c3b65848c7f3ba840fcb4b79f6dff69b92673611476313c299d76c60202b4a2a"

changed /files/skills~1project-os~1evals~1README.md/size

BEFORE
6691
AFTER
12170

changed /files/skills~1project-os~1evals~1continuity.json/sha256

BEFORE
"422f9f58bf9fed1e4cef30530fbe8575f5608d06ba96856e2563d111e74eec9f"
AFTER
"bf280f2af4ced82a691038a2c3103c49b7d3020175f9f30a0bc57730f6008fac"

changed /files/skills~1project-os~1evals~1continuity.json/size

BEFORE
8009
AFTER
9943

changed /files/skills~1project-os~1evals~1prepare_fixture.py/sha256

BEFORE
"cf48d253631705601cc1c982f3d343024b67da4e61ed1509eaac97f976024df1"
AFTER
"fd2dab2f5019079029c75900765f2b296eec40ea0bd3487827cfe3c082d17318"

changed /files/skills~1project-os~1evals~1prepare_fixture.py/size

BEFORE
14954
AFTER
19564

changed /files/skills~1project-os~1evals~1prompts.json/sha256

BEFORE
"11f8ebe82f718731e10bedbad201eaa7bd67454bd34ca103bf528cd18059817d"
AFTER
"4b1e3e80e486568d8409e3b7ec063790cce05fe7cb3cd0535bd803b50d530e7a"

changed /files/skills~1project-os~1evals~1prompts.json/size

BEFORE
11869
AFTER
17558

changed /files/skills~1project-os~1references~1knowledge.md/sha256

BEFORE
"8c811b5186634dd950ff35a2712134dce67a97fd072012f4767ceec8a66825ff"
AFTER
"1c4f0bf06f5f6a19e8f794c9365f4478be0e151dc816fe3eec1c933e621ed9b0"

changed /files/skills~1project-os~1references~1knowledge.md/size

BEFORE
14667
AFTER
15110

changed /files/skills~1project-os~1references~1maintenance.md/sha256

BEFORE
"a8981a66357b6606a27adc4f42bf2ee6e493648a576d9ae06dafdcd4404c9f53"
AFTER
"0174ce58621c5a2db1e38ce613ccb024fa61a2b7290e0ad66ba5cf0c50f87215"

changed /files/skills~1project-os~1references~1maintenance.md/size

BEFORE
21134
AFTER
29861

changed /files/skills~1project-os~1scripts~1project_os.py/sha256

BEFORE
"e137844eb37a0638ee8e5388ee307a963723ad036c7085f47d23a269ca44c6d9"
AFTER
"31df2a4d1344d874af84f7a28747e4adc5461f1ca834d451af8882891705ec44"

changed /files/skills~1project-os~1scripts~1project_os.py/size

BEFORE
296898
AFTER
305688

added /files/skills~1project-os~1scripts~1snapshot.py

BEFORE
Field was absent
AFTER
{
  "sha256": "941ad62108dc2cbf2ff16cc3250e5d7f685bc1dbcc25048d9028639d52ddd2ed",
  "size": 19807
}
Full snapshot data
{
  "files": {
    ".codex-plugin/plugin.json": {
      "sha256": "964a70c3ee9557317874096587789d2888ea6ecd7281245c0da3731456c249f2",
      "size": 2508
    },
    "CHANGELOG.md": {
      "sha256": "fd58d7245a98a676c07e45ad9127f10260556b4b7daf3c9ea100c19c86402916",
      "size": 21328
    },
    "CONTRIBUTING.md": {
      "sha256": "73b7d4ae913de6dc39d396c3a79b31b7c5c7b4851cb51bd3cef51f26da78b223",
      "size": 9634
    },
    "LICENSE": {
      "sha256": "2b5277a87aa3ff5fa8bf0155b36a1e7f6c2c5e099123fd5666436352670b129e",
      "size": 1081
    },
    "README.md": {
      "sha256": "09805879825282fe758dd1522b3b700e459b4e5b01f6d7b25a80471a3fe755da",
      "size": 7158
    },
    "SECURITY.md": {
      "sha256": "d9a0de14687f9c71d156d53019b72f5c765aa0945c7c2f7cafaedde154aa397a",
      "size": 6511
    },
    "assets/icon.svg": {
      "sha256": "320ef870116057315ea41f8015064f69666beb37f6a0dbbb0b46f08612976f4c",
      "size": 641
    },
    "assets/logo.svg": {
      "sha256": "9e73a9b4c30c8ddf8056da1ae6258ef50a42c6a5b2b9fe9222cec613612f83cd",
      "size": 643
    },
    "assets/social-preview.png": {
      "sha256": "464a52ca13f2be4531c19db996ec0adad6080b6a04d828c7660c2e3a5c3eaf42",
      "size": 48952
    },
    "assets/social-preview.svg": {
      "sha256": "eebe9d47501e2f3a8d13213e3a5e55c77446af0c268da48cd7fe3d5d95b49c70",
      "size": 2914
    },
    "docs/HOW_IT_WORKS.md": {
      "sha256": "6b59b13ea46aef256483d366ece76cbf517bdd20411b0bdd8a5d1cc91c822173",
      "size": 5773
    },
    "docs/PACKAGING.md": {
      "sha256": "b2a2d2f57ccc992018ba504ee0bbd1609cca7bb58723267865df011efe3d4adf",
      "size": 27884
    },
    "docs/PRIVACY.md": {
      "sha256": "1ed53959c1723ddddd94ec167a5fd60365fc2db1e6daa4be3a11fd6542a6ad81",
      "size": 2785
    },
    "docs/REFERENCE.md": {
      "sha256": "8769bbadb95ece8ec94746500708c5d9b41b111cbe9e545b3d2bb2a59a8543be",
      "size": 54567
    },
    "docs/SETUP.md": {
      "sha256": "cdd61c87ddd33af407721a5ea58d03440882aa2ef09f4c8f54b10066e3f0d78e",
      "size": 7926
    },
    "docs/TERMS.md": {
      "sha256": "d900fa8cb94916a77e646eca74db7a6d972379e1b671b4792786291f12858c4d",
      "size": 1918
    },
    "docs/USAGE.md": {
      "sha256": "5ca293b9ab2e7d78826e1401f1547d7e942cf4f4208ccf495adf5909aeec0ee5",
      "size": 10354
    },
    "plugin.json": {
      "sha256": "9457aff3398b62d4f7f8ee9ebb7427cb8a92fea22467f566a01c42fddb600437",
      "size": 2706
    },
    "scripts/check_codex_review.py": {
      "sha256": "9a19981b9a6775f5b420a20ff25034dd76957e4597bb8453c97e7ce843482e77",
      "size": 33589
    },
    "scripts/package_plugin.py": {
      "sha256": "d179cc5f2e645dc305bf41ce1410cf9984cfa0633493589aae37f04d0901e825",
      "size": 12969
    },
    "skills/project-os/SKILL.md": {
      "sha256": "b2bc73471dd4731b8674be6983398606af9973389123374f436c51a5963f5626",
      "size": 19806
    },
    "skills/project-os/agents/openai.yaml": {
      "sha256": "6c2451a360c5b897d925249cd1063fcfa0ae6ce20d0c5356a9298d999e3e60e0",
      "size": 375
    },
    "skills/project-os/assets/icon-large.svg": {
      "sha256": "9e73a9b4c30c8ddf8056da1ae6258ef50a42c6a5b2b9fe9222cec613612f83cd",
      "size": 643
    },
    "skills/project-os/assets/icon-small.svg": {
      "sha256": "320ef870116057315ea41f8015064f69666beb37f6a0dbbb0b46f08612976f4c",
      "size": 641
    },
    "skills/project-os/assets/overlays/react-native-expo.md": {
      "sha256": "f3842aa1b10fabbed1651d0ef9ed857f2a6577d63f4e74fe2d97a56752bb254b",
      "size": 1035
    },
    "skills/project-os/assets/packs/README.md": {
      "sha256": "256c78e384ac70756c8192a7d1dae5449de59b86306c83bed2441a55a766cc2f",
      "size": 1028
    },
    "skills/project-os/assets/packs/data.md": {
      "sha256": "b785ef2be863917ea1b52abcb5e62d5fea29342ec3f913433b7773bfd636de02",
      "size": 833
    },
    "skills/project-os/assets/packs/delivery.md": {
      "sha256": "61e4974af6c36377f75f5d5a80a7a9c81b39b1812c56f32205d4076a89336bb6",
      "size": 829
    },
    "skills/project-os/assets/packs/mobile.md": {
      "sha256": "75653f85bcc653c6d138e1c1821e7bc768d8c85754ee1c100beb42c3c7bbc04d",
      "size": 966
    },
    "skills/project-os/assets/packs/service.md": {
      "sha256": "c9846ee0d6509812dc49b4b3d7ac7b161722f3c6fb5acbf8378daca2d5fea8d6",
      "size": 797
    },
    "skills/project-os/assets/packs/web.md": {
      "sha256": "b7c14b078bc66311f7602c93127445ea9c70eec73902c9e77f7e2e7a41ecb597",
      "size": 850
    },
    "skills/project-os/assets/templates/core/.agents/CONTEXT.md": {
      "sha256": "cac7e22dcb6bf3dd2fe32abbd6726ba3f8e96bfcd2e096ccbc5f593776b2fa02",
      "size": 1096
    },
    "skills/project-os/assets/templates/core/.agents/README.md": {
      "sha256": "cf747afe6237402ccebde9a2ec322752d6724d9e662dadb673cf3e83a2d8ad2a",
      "size": 1833
    },
    "skills/project-os/assets/templates/core/.agents/STATE.md": {
      "sha256": "deb7de342922767e6d5d9dc35545195693dbc5115d0e8c28edf5782b0b32daaf",
      "size": 739
    },
    "skills/project-os/assets/templates/core/.agents/WORKFLOW.md": {
      "sha256": "eb6b9ff8063c201059edb2d305d01028d75f7ae503ca0993bc2bd935b4db6d30",
      "size": 21145
    },
    "skills/project-os/assets/templates/core/.agents/evidence/README.md": {
      "sha256": "6d7305c99da57a53658b2e10d3d0a01bc0b96c0452f7d139feeba42554860c09",
      "size": 420
    },
    "skills/project-os/assets/templates/core/.agents/findings/README.md": {
      "sha256": "da004b9622fd04e37b073cc744298d050fc21cfda33ee6a5826f617fc5ad47a4",
      "size": 513
    },
    "skills/project-os/assets/templates/core/.agents/findings/findings.json": {
      "sha256": "10eaf276f6fa7c4d4fcb45d0dc4d45f8a0566531d8c7c7ebbe6973534777f09a",
      "size": 60
    },
    "skills/project-os/assets/templates/core/.agents/knowledge/README.md": {
      "sha256": "982e8d55715ae97ae94de270c51ad86cdc1c4de50a25152e21673471f6e3afa2",
      "size": 547
    },
    "skills/project-os/assets/templates/core/.agents/knowledge/project/failures.json": {
      "sha256": "7ce7bfa8f4813891b7883be037071b81afa56ecef5901a8cb25c61b201f46f82",
      "size": 76
    },
    "skills/project-os/assets/templates/core/.agents/knowledge/reusable/failures.json": {
      "sha256": "406e9052d7c5782d0e70febbe2a12d5a9e72046854bdac2684c4c7909900ddc3",
      "size": 43
    },
    "skills/project-os/assets/templates/core/.agents/plans/README.md": {
      "sha256": "605c6829a0b5a2f6e76146ccfac00cc712bdca8cdf109dc6bfbcfc18c48a1e7c",
      "size": 3707
    },
    "skills/project-os/assets/templates/core/.agents/plans/index.json": {
      "sha256": "bde14cb71b0a712b1fc338ecf98432bbc4babe4e0ed8930066c6c9fc8b4144a2",
      "size": 138
    },
    "skills/project-os/assets/templates/core/.agents/requests.json": {
      "sha256": "f6942bd914e9ada67b56aaccec14d4da9e4806888f5c265cee6e6018315c8935",
      "size": 60
    },
    "skills/project-os/assets/templates/core/AGENTS.md": {
      "sha256": "e3c910d1fb74dca2f79ad45f26d5aefe384bc46ba83d2fdf15e6d981a8af644d",
      "size": 5798
    },
    "skills/project-os/assets/templates/program/PROGRAM.md": {
      "sha256": "02ef62d5362b0362b6533bcde4ba84c3452d796667f0a63686045fe21b5b0127",
      "size": 561
    },
    "skills/project-os/assets/templates/program/history/README.md": {
      "sha256": "5545722071313de97efc9311065e2979b1bbf7e87baa177d10e3af0328c530f8",
      "size": 417
    },
    "skills/project-os/evals/README.md": {
      "sha256": "c3b65848c7f3ba840fcb4b79f6dff69b92673611476313c299d76c60202b4a2a",
      "size": 12170
    },
    "skills/project-os/evals/continuity.json": {
      "sha256": "bf280f2af4ced82a691038a2c3103c49b7d3020175f9f30a0bc57730f6008fac",
      "size": 9943
    },
    "skills/project-os/evals/discovery.json": {
      "sha256": "f010fc729527fbb22dc66331eb2f8571ba883d895575ca1f624d57935b0c3bda",
      "size": 8368
    },
    "skills/project-os/evals/prepare_fixture.py": {
      "sha256": "fd2dab2f5019079029c75900765f2b296eec40ea0bd3487827cfe3c082d17318",
      "size": 19564
    },
    "skills/project-os/evals/prompts.json": {
      "sha256": "4b1e3e80e486568d8409e3b7ec063790cce05fe7cb3cd0535bd803b50d530e7a",
      "size": 17558
    },
    "skills/project-os/evals/submission.json": {
      "sha256": "cc2285a755802641d990775f3f71ea81259f7bf7669c559fd44b62aa9ec3d98d",
      "size": 13959
    },
    "skills/project-os/references/bootstrap.md": {
      "sha256": "0c9d373b65d1580a2addee2670e81cddf280559efed12ebc98cf4d31a8a600e1",
      "size": 5075
    },
    "skills/project-os/references/knowledge.md": {
      "sha256": "1c4f0bf06f5f6a19e8f794c9365f4478be0e151dc816fe3eec1c933e621ed9b0",
      "size": 15110
    },
    "skills/project-os/references/maintenance.md": {
      "sha256": "0174ce58621c5a2db1e38ce613ccb024fa61a2b7290e0ad66ba5cf0c50f87215",
      "size": 29861
    },
    "skills/project-os/scripts/project_os.py": {
      "sha256": "31df2a4d1344d874af84f7a28747e4adc5461f1ca834d451af8882891705ec44",
      "size": 305688
    },
    "skills/project-os/scripts/snapshot.py": {
      "sha256": "941ad62108dc2cbf2ff16cc3250e5d7f685bc1dbcc25048d9028639d52ddd2ed",
      "size": 19807
    }
  }
}

SHA-256 of public snapshot: 5eab4f74720003e876eed08c6fa153f3bf461301ca0686a6c2372074ec74aed0