Update to Engineering Project OS
Snapshot Nov 3, 2026 · 06:11 UTC · version 2.3.0
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
Oct 24, 2026 · 13:23 UTC
d487557331b74989ac13a90bcbb8cdcb27e8c202599e3b1f78c81c8718fdc1bc
Nov 3, 2026 · 06:11 UTC
964a70c3ee9557317874096587789d2888ea6ecd7281245c0da3731456c249f2
Package file
Oct 24, 2026 · 13:23 UTC
ee3411d4c27efadc09348fe329d1be184f87525828def9fec344955c2a8c57c8
Nov 3, 2026 · 06:11 UTC
fd58d7245a98a676c07e45ad9127f10260556b4b7daf3c9ea100c19c86402916
Package file
Oct 24, 2026 · 13:23 UTC
17915
Nov 3, 2026 · 06:11 UTC
21328
Package file
Oct 24, 2026 · 13:23 UTC
94b36220889a83e481fbb29ed7a71e8e6035e45103a10b9a157e1210b980e6b3
Nov 3, 2026 · 06:11 UTC
73b7d4ae913de6dc39d396c3a79b31b7c5c7b4851cb51bd3cef51f26da78b223
Compare saved observations
Download comparison JSONChanged files
Choose a file to see its text changes. Binary or large files show metadata only.
scripts/check_codex_review.py →
skills/project-os/assets/templates/core/.agents/WORKFLOW.md →
skills/project-os/assets/templates/core/AGENTS.md →
skills/project-os/evals/README.md →
skills/project-os/evals/continuity.json →
skills/project-os/evals/prepare_fixture.py →
skills/project-os/evals/prompts.json →
skills/project-os/references/knowledge.md →
skills/project-os/references/maintenance.md →
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
"d487557331b74989ac13a90bcbb8cdcb27e8c202599e3b1f78c81c8718fdc1bc"
"964a70c3ee9557317874096587789d2888ea6ecd7281245c0da3731456c249f2"
changed /files/CHANGELOG.md/sha256
"ee3411d4c27efadc09348fe329d1be184f87525828def9fec344955c2a8c57c8"
"fd58d7245a98a676c07e45ad9127f10260556b4b7daf3c9ea100c19c86402916"
changed /files/CHANGELOG.md/size
17915
21328
changed /files/CONTRIBUTING.md/sha256
"94b36220889a83e481fbb29ed7a71e8e6035e45103a10b9a157e1210b980e6b3"
"73b7d4ae913de6dc39d396c3a79b31b7c5c7b4851cb51bd3cef51f26da78b223"
changed /files/CONTRIBUTING.md/size
8642
9634
changed /files/README.md/sha256
"7977a83f2221456b48c070737048dda8c32b8eca63e1f89745cfc8b1f8ee326b"
"09805879825282fe758dd1522b3b700e459b4e5b01f6d7b25a80471a3fe755da"
changed /files/README.md/size
11635
7158
changed /files/SECURITY.md/sha256
"1bab4538644615e7b47e36e9879fa28983a3aedc7c8c7a4590b77d14e4fd6f45"
"d9a0de14687f9c71d156d53019b72f5c765aa0945c7c2f7cafaedde154aa397a"
changed /files/SECURITY.md/size
6359
6511
changed /files/docs~1HOW_IT_WORKS.md/sha256
"6718c2aed368d943b54582d93931b0af11ecec6d14adf637a0e942148f813d0e"
"6b59b13ea46aef256483d366ece76cbf517bdd20411b0bdd8a5d1cc91c822173"
changed /files/docs~1HOW_IT_WORKS.md/size
14975
5773
changed /files/docs~1PACKAGING.md/sha256
"cfc8c0377706ffd5505c65e798b5012880a3969e9e6ec1ad155ad68a0f489f6c"
"b2a2d2f57ccc992018ba504ee0bbd1609cca7bb58723267865df011efe3d4adf"
changed /files/docs~1PACKAGING.md/size
21907
27884
changed /files/docs~1PRIVACY.md/sha256
"8196e7a8dd005f8e63c3ae70e7c5387bb5c9e6b343a92a6edd26084927d1588f"
"1ed53959c1723ddddd94ec167a5fd60365fc2db1e6daa4be3a11fd6542a6ad81"
changed /files/docs~1PRIVACY.md/size
2389
2785
changed /files/docs~1REFERENCE.md/sha256
"7917ea8ae9bb4a359c0e7068b8260f604fd9e62f84e09270a69c9c94f295c205"
"8769bbadb95ece8ec94746500708c5d9b41b111cbe9e545b3d2bb2a59a8543be"
changed /files/docs~1REFERENCE.md/size
45683
54567
changed /files/docs~1SETUP.md/sha256
"f3247394e05cc1be13794807c88f37c5c95b30946720be8d34ac3ce98c7e1d5b"
"cdd61c87ddd33af407721a5ea58d03440882aa2ef09f4c8f54b10066e3f0d78e"
changed /files/docs~1SETUP.md/size
10373
7926
changed /files/docs~1USAGE.md/sha256
"32fc4670c4c3156d0aa3c34b70a39e1503f15509c1f2305c2b1c4b9620785c9f"
"5ca293b9ab2e7d78826e1401f1547d7e942cf4f4208ccf495adf5909aeec0ee5"
changed /files/docs~1USAGE.md/size
16614
10354
changed /files/plugin.json/sha256
"a78f2e8405ea19efc1f3b8f69e61b2c59340f450fadc49b56feba1e691ff2b89"
"9457aff3398b62d4f7f8ee9ebb7427cb8a92fea22467f566a01c42fddb600437"
changed /files/scripts~1check_codex_review.py/sha256
"34582976581a5dc8ef4d88187965b49023ceeca3057711186b7f209888cfeecf"
"9a19981b9a6775f5b420a20ff25034dd76957e4597bb8453c97e7ce843482e77"
changed /files/scripts~1check_codex_review.py/size
25187
33589
changed /files/skills~1project-os~1SKILL.md/sha256
"7f884b2613e0eac3dd7a9b34345b8d9c25778d41a61eac6268323799c0cb63b4"
"b2bc73471dd4731b8674be6983398606af9973389123374f436c51a5963f5626"
changed /files/skills~1project-os~1SKILL.md/size
14525
19806
changed /files/skills~1project-os~1assets~1templates~1core~1.agents~1WORKFLOW.md/sha256
"f6af58603c0b52d0c4ccce595776f3b326e67f9f9e6981ab21f9a8ebb1c1175f"
"eb6b9ff8063c201059edb2d305d01028d75f7ae503ca0993bc2bd935b4db6d30"
changed /files/skills~1project-os~1assets~1templates~1core~1.agents~1WORKFLOW.md/size
16307
21145
changed /files/skills~1project-os~1assets~1templates~1core~1AGENTS.md/sha256
"58aa0b9d0eb9dd09ed252e8283e5897b9c4bcf5f0805c113adf1e245e623f590"
"e3c910d1fb74dca2f79ad45f26d5aefe384bc46ba83d2fdf15e6d981a8af644d"
changed /files/skills~1project-os~1assets~1templates~1core~1AGENTS.md/size
4978
5798
changed /files/skills~1project-os~1evals~1README.md/sha256
"08e91e553ad39a7e8232d4abe1d6b04f8b3fe705294ffc58faa993192b8b60b4"
"c3b65848c7f3ba840fcb4b79f6dff69b92673611476313c299d76c60202b4a2a"
changed /files/skills~1project-os~1evals~1README.md/size
6691
12170
changed /files/skills~1project-os~1evals~1continuity.json/sha256
"422f9f58bf9fed1e4cef30530fbe8575f5608d06ba96856e2563d111e74eec9f"
"bf280f2af4ced82a691038a2c3103c49b7d3020175f9f30a0bc57730f6008fac"
changed /files/skills~1project-os~1evals~1continuity.json/size
8009
9943
changed /files/skills~1project-os~1evals~1prepare_fixture.py/sha256
"cf48d253631705601cc1c982f3d343024b67da4e61ed1509eaac97f976024df1"
"fd2dab2f5019079029c75900765f2b296eec40ea0bd3487827cfe3c082d17318"
changed /files/skills~1project-os~1evals~1prepare_fixture.py/size
14954
19564
changed /files/skills~1project-os~1evals~1prompts.json/sha256
"11f8ebe82f718731e10bedbad201eaa7bd67454bd34ca103bf528cd18059817d"
"4b1e3e80e486568d8409e3b7ec063790cce05fe7cb3cd0535bd803b50d530e7a"
changed /files/skills~1project-os~1evals~1prompts.json/size
11869
17558
changed /files/skills~1project-os~1references~1knowledge.md/sha256
"8c811b5186634dd950ff35a2712134dce67a97fd072012f4767ceec8a66825ff"
"1c4f0bf06f5f6a19e8f794c9365f4478be0e151dc816fe3eec1c933e621ed9b0"
changed /files/skills~1project-os~1references~1knowledge.md/size
14667
15110
changed /files/skills~1project-os~1references~1maintenance.md/sha256
"a8981a66357b6606a27adc4f42bf2ee6e493648a576d9ae06dafdcd4404c9f53"
"0174ce58621c5a2db1e38ce613ccb024fa61a2b7290e0ad66ba5cf0c50f87215"
changed /files/skills~1project-os~1references~1maintenance.md/size
21134
29861
changed /files/skills~1project-os~1scripts~1project_os.py/sha256
"e137844eb37a0638ee8e5388ee307a963723ad036c7085f47d23a269ca44c6d9"
"31df2a4d1344d874af84f7a28747e4adc5461f1ca834d451af8882891705ec44"
changed /files/skills~1project-os~1scripts~1project_os.py/size
296898
305688
added /files/skills~1project-os~1scripts~1snapshot.py
Field was absent
{
"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