Repository navigation
Conversation
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 960af6db0f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if prior.get("result_sha256") != _hash({k: v for k, v in prior.items() if k != "result_sha256"}): | ||
| raise InitError("foundation feedback prior result hash mismatch") | ||
| if prior.get("result_sha256") not in getattr(stage, "_foundation_validated_results", set()): | ||
| _validate_result(stage, prior) |
There was a problem hiding this comment.
Authenticate rejected verdicts before reusing their feedback
A checkpoint containing only a rejected facet has no artifact—and therefore no archived judge receipt—for _validate_result to authenticate. Anyone able to alter that checkpoint can replace verdicts[*].reasons, recompute the ordinary result_sha256, and have these lines accept the fabricated reasons as retry feedback; the next native generator trace then permanently binds the tampered prompt and passes subsequent replay. Store and verify a native rejection receipt, rather than treating a recomputable result hash as validation, before supplying rejection data to a correction.
Useful? React with 👍 / 👎.
| if attempts: | ||
| latest = attempts[-1] | ||
| key = f"knowledge:{original['owner'].owner}:{facet}" | ||
| verdict = latest.get("verdicts", {}).get(key, {}) |
There was a problem hiding this comment.
Preserve the latest review across transient retry errors
When an initial draft receives useful rejection reasons but its first correction is checkpointed with a generator/model error, latest is the errored attempt and has no verdict, so the following correction receives an empty last_review_reasons instead of the still-relevant independent review. Because errored attempts count toward the three-correction limit, subsequent retries can be exhausted without ever seeing the guidance they were introduced to use; select the newest attempt with a qualifying verdict separately from the newest attempt supplying last_error.
Useful? React with 👍 / 👎.
Unlimited version 4 foundation resumes retried missing facets without the previous independent review reasons. Resumed jobs now receive advisory feedback for the same owner, page and still requested facets, with references to validated earlier input/result hashes. Corrective payloads have distinct hashes, preserving prior attempts and approvals.
Each facet permits an initial extraction and at most three corrections. Exhausted facets remain explicitly unknown and keep publication targets unmet. Wrong owner/page/facet, legacy jobs, unrelated drops and passing verdicts cannot provide rejection reasons. Uncheckpointed interruptions do not consume a correction. Feedback never acts as source evidence or approval.
The original version 4 system, global run identity, model roles, source pin, catalog/base binding, full evidence packet, byte caps and native proof validators remain unchanged. Historical approvals replay with their original inputs.
Validation: All 70 combined checks passed on exact head 960af6d: 13 new regressions and 57 existing context, native foundation, resume and publication checks. Independent exact-head source review found no remaining issues; independent test verification is finishing. A genuine corrected native artifact rejects feedback tampering even after checkpoint hashes are recomputed. No formal knowledge, adapter or active runtime files are changed.