diff --git a/apps/decodex/src/radar.rs b/apps/decodex/src/radar.rs index d897c06..a4936ae 100644 --- a/apps/decodex/src/radar.rs +++ b/apps/decodex/src/radar.rs @@ -40,6 +40,7 @@ const DEFAULT_TAG_PREFIX: &str = "rust-v"; const RELEASE_DELTA_SCHEMA: &str = "release_delta/v1"; const SCHEMA_VERSION: i64 = 2; const SIGNAL_SCHEMA: &str = "signal_entry/v1"; +const SOCIAL_CANDIDATE_SCHEMA: &str = "social_candidate/v1"; const SOCIAL_POST_SCHEMA: &str = "social_post/v1"; const UPSTREAM_IMPACT_SCHEMA: &str = "upstream_impact/v1"; const UPSTREAM_REVIEW_QUEUE_SCHEMA: &str = "upstream_review_queue/v1"; @@ -50,6 +51,7 @@ const DEFAULT_VALIDATION_PATHS: &[&str] = &[ "artifacts/github/review-queue", "artifacts/github/reviews", "artifacts/github/impact", + "artifacts/github/social-candidates", "artifacts/social/x", "site/src/content/signals", "site/src/content/release-deltas", @@ -75,8 +77,14 @@ const SOCIAL_POST_WORTHINESS: &[&str] = &["block", "publish", "skip"]; const SOURCE_ITEM_KINDS: &[&str] = &["commit", "pull_request"]; const UPSTREAM_IMPACT_KINDS: &[&str] = &["browser_observation", "changelog", "commit", "pull_request", "release", "signal"]; -const UPSTREAM_REVIEW_ACTION_TYPES: &[&str] = - &["linear_followup", "none", "signal_entry", "social_post", "upstream_impact"]; +const UPSTREAM_REVIEW_ACTION_TYPES: &[&str] = &[ + "linear_followup", + "none", + "signal_entry", + "social_candidate", + "social_post", + "upstream_impact", +]; const UPSTREAM_REVIEW_NEXT_STEPS: &[&str] = &["ai_review_required"]; const UPSTREAM_REVIEW_PRIORITIES: &[&str] = &["critical", "high", "low", "normal"]; const UPSTREAM_SOURCE_STATES: &[&str] = &["closed", "commit_only", "merged", "open"]; @@ -4221,6 +4229,7 @@ fn validate_artifact(payload: &Value) -> ArtifactValidation { Some(CONFIG_FEATURE_CATALOG_SCHEMA) => validate_config_feature_catalog(entry, &mut errors), Some(RELEASE_DELTA_SCHEMA) => validate_release_delta(entry, &mut errors), Some(SIGNAL_SCHEMA) => validate_signal(entry, &mut errors), + Some(SOCIAL_CANDIDATE_SCHEMA) => validate_social_candidate(entry, &mut errors), Some(SOCIAL_POST_SCHEMA) => validate_social_post(entry, &mut errors), Some(UPSTREAM_IMPACT_SCHEMA) => validate_upstream_impact(entry, &mut errors), Some(UPSTREAM_REVIEW_QUEUE_SCHEMA) => validate_upstream_review_queue(entry, &mut errors), @@ -5137,6 +5146,76 @@ fn validate_upstream_impact_source_refs(refs: Option<&Value>, errors: &mut Vec, errors: &mut Vec) { + for field in ["slug", "repo", "audience"] { + if !is_non_empty_string(entry.get(field)) { + errors.push(format!("{field} must be a non-empty string")); + } + } + + if string_field(entry, "repo").is_some_and(|repo| !repo.contains('/')) { + errors.push("repo must be owner/name".into()); + } + if string_field(entry, "channel") != Some("x") { + errors.push("channel must be x".into()); + } + if string_field(entry, "target_account") != Some("decodexspace") { + errors.push("target_account must be decodexspace".into()); + } + if !matches_one_of(entry.get("mode"), SOCIAL_POST_MODES) { + errors.push(format!("mode must be one of {}", choices(SOCIAL_POST_MODES))); + } + if !matches_one_of(entry.get("priority"), SOCIAL_POST_PRIORITIES) { + errors.push(format!("priority must be one of {}", choices(SOCIAL_POST_PRIORITIES))); + } + + validate_social_post_text(entry.get("candidate_text"), errors); + validate_social_candidate_source_refs(entry.get("source_refs"), errors); + validate_non_empty_string_list(entry.get("evidence_notes"), "evidence_notes", errors); + validate_social_post_claims(entry.get("claims"), errors); + validate_social_candidate_decision(entry.get("decision"), errors); + + for field in ["caveats", "next_steps"] { + validate_optional_string_list(entry.get(field), field, errors); + } +} + +fn validate_social_candidate_source_refs(refs: Option<&Value>, errors: &mut Vec) { + let Some(refs) = refs.and_then(Value::as_object) else { + errors.push("source_refs must be an object".into()); + + return; + }; + let has_refs = ["upstream_reviews", "upstream_impacts", "signals", "release_deltas", "urls"] + .iter() + .any(|field| refs.get(*field).is_some_and(|value| !is_empty_or_missing_array(Some(value)))); + + if !has_refs { + errors.push( + "source_refs must include upstream_reviews, upstream_impacts, signals, release_deltas, or urls" + .into(), + ); + } +} + +fn validate_social_candidate_decision(decision: Option<&Value>, errors: &mut Vec) { + let Some(decision) = decision.and_then(Value::as_object) else { + errors.push("decision must be an object".into()); + + return; + }; + + if !matches_one_of(decision.get("worthiness"), &["defer", "publish", "skip"]) { + errors.push("decision.worthiness must be one of ['defer', 'publish', 'skip']".into()); + } + + for field in ["reason", "idempotency_key"] { + if !is_non_empty_string(decision.get(field)) { + errors.push(format!("decision.{field} must be a non-empty string")); + } + } +} + fn validate_social_post(entry: &Map, errors: &mut Vec) { for field in ["slug", "audience"] { if !is_non_empty_string(entry.get(field)) { @@ -5503,6 +5582,7 @@ fn known_schemas() -> String { CONFIG_FEATURE_CATALOG_SCHEMA, RELEASE_DELTA_SCHEMA, SIGNAL_SCHEMA, + SOCIAL_CANDIDATE_SCHEMA, SOCIAL_POST_SCHEMA, UPSTREAM_IMPACT_SCHEMA, UPSTREAM_REVIEW_QUEUE_SCHEMA, @@ -5746,6 +5826,17 @@ mod tests { assert_errors(&review, ["next_actions[0].type must be one of"]); } + #[test] + fn accepts_valid_social_candidate_and_rejects_missing_refs() { + let mut candidate = valid_social_candidate(); + + assert_errors(&candidate, []); + + candidate["source_refs"] = serde_json::json!({}); + + assert_errors(&candidate, ["source_refs must include upstream_reviews"]); + } + #[test] fn accepts_valid_upstream_impact_and_rejects_bad_angle() { let mut impact = valid_upstream_impact(); @@ -6449,6 +6540,40 @@ mod tests { }) } + fn valid_social_candidate() -> Value { + serde_json::json!({ + "schema": "social_candidate/v1", + "slug": "openai-codex-pr-22414", + "repo": "openai/codex", + "channel": "x", + "target_account": "decodexspace", + "mode": "operator_impact", + "priority": "normal", + "audience": "Codex operators", + "candidate_text": [ + "Remote Codex can now use Unix socket endpoints. Source: https://github.com/openai/codex/pull/22414" + ], + "source_refs": { + "upstream_reviews": ["artifacts/github/reviews/openai-codex-pr-22414.review.json"], + "upstream_impacts": ["artifacts/github/impact/openai-codex-pr-22414.json"], + "urls": ["https://github.com/openai/codex/pull/22414"] + }, + "evidence_notes": ["PR #22414 changes remote endpoint handling."], + "claims": [ + { + "text": "Remote Codex can use Unix socket endpoints.", + "evidence": "https://github.com/openai/codex/pull/22414", + "confidence": "confirmed" + } + ], + "decision": { + "worthiness": "publish", + "reason": "The source-backed review has a clear operator impact angle.", + "idempotency_key": "x:decodexspace:openai-codex-pr-22414:operator_impact" + } + }) + } + fn valid_social_post() -> Value { serde_json::json!({ "schema": "social_post/v1", diff --git a/artifacts/github/README.md b/artifacts/github/README.md index 785043a..68a2edd 100644 --- a/artifacts/github/README.md +++ b/artifacts/github/README.md @@ -5,6 +5,7 @@ This directory stores checked-in GitHub signal pipeline artifacts. - `bundles/` holds normalized `github_change_bundle/v1` inputs. - `analysis/` holds reviewed Codex editorial analysis drafts. - `impact/` holds optional `upstream_impact/v1` classifications. +- `social-candidates/` holds optional `social_candidate/v1` Publisher handoffs. `bundles/` and `analysis/` are hot raw artifact directories. Keep raw entries in Git for at most 21 days, then move cold batches to dedicated `radar-archive-*` GitHub Release diff --git a/artifacts/github/bundles/openai-codex-pr-25469.json b/artifacts/github/bundles/openai-codex-pr-25469.json new file mode 100644 index 0000000..ed3465f --- /dev/null +++ b/artifacts/github/bundles/openai-codex-pr-25469.json @@ -0,0 +1,79 @@ +{ + "analysis_mode": "pr_first", + "commits": [ + { + "author": "dhruvgupta-oai", + "committed_at": "2026-06-01T00:41:19Z", + "message": "Add app server account session protocol", + "sha": "cc0c295e8d848ddfe2f3205dbce32bfc4f4c04b6", + "url": "https://github.com/openai/codex/commit/cc0c295e8d848ddfe2f3205dbce32bfc4f4c04b6" + }, + { + "author": "dhruvgupta-oai", + "committed_at": "2026-06-01T02:13:39Z", + "message": "Fix account session protocol layering", + "sha": "5327fc53dc007e3b35f092145d616f0339b18f94", + "url": "https://github.com/openai/codex/commit/5327fc53dc007e3b35f092145d616f0339b18f94" + }, + { + "author": "dhruvgupta-oai", + "committed_at": "2026-06-02T09:02:29Z", + "message": "Remove unused account session metadata", + "sha": "3ad459228152dd5a64a6b68d7fbc485ede24d6a0", + "url": "https://github.com/openai/codex/commit/3ad459228152dd5a64a6b68d7fbc485ede24d6a0" + } + ], + "default_branch": "main", + "docs_refs": [], + "examples_refs": [], + "extracted_flags": [ + "GET" + ], + "files": [ + { + "additions": 72, + "deletions": 0, + "patch_excerpt": "@@ -138,6 +138,78 @@ pub struct CancelLoginAccountResponse {\n pub status: CancelLoginAccountStatus,\n }\n \n+#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)]\n+#[serde(rename_all = \"camelCase\")]\n+#[ts(export_to = \"v2/\")]\n+pub struct AccountSessionsAddParams {\n+ #[serde(default, skip_serializing_if = \"std::ops::Not::not\")]\n+ pub switch_to_added_account: bool,\n+}\n+\n+#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)]\n+#[serde(rename_all = \"camelCase\")]\n+#[ts(export_to = \"v2/\")]\n+pub struct AccountSessionsListParams {\n+ #[serde(default, skip_serializing_if = \"std::ops::Not::not\")]\n+ pub refresh_workspace_metadata: bool,\n+}\n+\n+#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)]\n+#[serde(rename_all = \"camelCase\")]\n+#[ts(export_to = \"v2/\")]\n+pub struct AccountSessionsLogoutParams {\n+ pub session_...", + "path": "codex-rs/app-server-protocol/src/protocol/v2/account.rs", + "status": "modified" + }, + { + "additions": 11, + "deletions": 0, + "patch_excerpt": "@@ -1,3 +1,4 @@\n+use crate::types::AccountsCheckResponse;\n use crate::types::CodeTaskDetailsResponse;\n use crate::types::ConfigBundleResponse;\n use crate::types::ConfigFileResponse;\n@@ -303,6 +304,16 @@ impl Client {\n Ok(Self::rate_limit_snapshots_from_payload(payload))\n }\n \n+ pub async fn get_accounts_check(&self) -> Result {\n+ let url = match self.path_style {\n+ PathStyle::CodexApi => format!(\"{}/api/codex/accounts/check\", self.base_url),\n+ PathStyle::ChatGptApi => format!(\"{}/wham/accounts/check\", self.base_url),\n+ };\n+ let req = self.http.get(&url).headers(self.headers());\n+ let (body, ct) = self.exec_request(req, \"GET\", &url).await?;\n+ self.decode_json(&url, &ct, &body)\n+ }\n+\n pub async fn send_add_credits_nudge_email(\n &self,\n credit_type: AddCreditsNudgeCreditType,", + "path": "codex-rs/backend-client/src/client.rs", + "status": "modified" + }, + { + "additions": 2, + "deletions": 0, + "patch_excerpt": "@@ -4,6 +4,8 @@ pub(crate) mod types;\n pub use client::AddCreditsNudgeCreditType;\n pub use client::Client;\n pub use client::RequestError;\n+pub use types::AccountEntry;\n+pub use types::AccountsCheckResponse;\n pub use types::CodeTaskDetailsResponse;\n pub use types::CodeTaskDetailsResponseExt;\n pub use types::ConfigBundleResponse;", + "path": "codex-rs/backend-client/src/lib.rs", + "status": "modified" + }, + { + "additions": 87, + "deletions": 0, + "patch_excerpt": "@@ -18,6 +18,93 @@ use serde::de::Deserializer;\n use serde_json::Value;\n use std::collections::HashMap;\n \n+#[derive(Clone, Debug)]\n+pub struct AccountsCheckResponse {\n+ pub accounts: Vec,\n+ pub account_ordering: Vec,\n+ pub default_account_id: Option,\n+}\n+\n+#[derive(Clone, Debug, Deserialize)]\n+pub struct AccountEntry {\n+ pub id: String,\n+ #[serde(default)]\n+ pub name: Option,\n+ #[serde(default)]\n+ pub profile_picture_url: Option,\n+ #[serde(default)]\n+ pub structure: String,\n+}\n+\n+#[derive(Deserialize)]\n+struct RawAccountsCheckResponse {\n+ #[serde(default)]\n+ accounts: RawAccounts,\n+ #[serde(default)]\n+ account_ordering: Vec,\n+ #[serde(default)]\n+ default_account_id: Option,\n+}\n+\n+#[derive(Deserialize)]\n+#[serde(untagged)]\n+enum RawAccounts {\n+ List(Vec),\n+ Map...", + "path": "codex-rs/backend-client/src/types.rs", + "status": "modified" + } + ], + "linked_issues": [ + "openai/codex#25383" + ], + "notes": [ + "Built from GitHub pull-request, commits, files, and repo endpoints." + ], + "primary_pr": { + "body": "## Summary\n\nAdds the app-server v2 `accountSession/*` protocol used by the Desktop profile switcher and the backend account metadata client needed to populate workspace choices.\n\nThis is the protocol layer only. The app-server lifecycle and consolidated saved-session storage are split into a follow-up PR.\n\n## Rust Stack\n\n1. This PR\n2. [openai/codex#25383](https://github.com/openai/codex/pull/25383) adds app-server session lifecycle behavior and consolidated saved-session storage.\n\n## Validation\n\n- Generated app-server schema fixtures are included from the existing generation flow in the lifecycle PR where the routes are registered.\n- Did not run tests per requested scope.\n", + "labels": [], + "merged_at": "2026-06-03T19:55:12Z", + "number": 25469, + "state": "merged", + "title": "[profile-switcher][rust] -- [1/2] Add app-server account session protocol", + "url": "https://github.com/openai/codex/pull/25469" + }, + "repo": "openai/codex", + "schema": "github_change_bundle/v1" +} diff --git a/artifacts/github/bundles/openai-codex-pr-26106.json b/artifacts/github/bundles/openai-codex-pr-26106.json new file mode 100644 index 0000000..c5f432d --- /dev/null +++ b/artifacts/github/bundles/openai-codex-pr-26106.json @@ -0,0 +1,298 @@ +{ + "analysis_mode": "pr_first", + "commits": [ + { + "author": "jif-oai", + "committed_at": "2026-06-03T08:34:17Z", + "message": "feat: skills 2", + "sha": "7eff30bf8e3ecdc87e8fe95f089a666f3f95ba1f", + "url": "https://github.com/openai/codex/commit/7eff30bf8e3ecdc87e8fe95f089a666f3f95ba1f" + }, + { + "author": "jif-oai", + "committed_at": "2026-06-03T10:26:26Z", + "message": "Merge remote-tracking branch 'origin/main' into jif/skills-2", + "sha": "554d22fecdec860db21fbd703a2f9d68cedf7869", + "url": "https://github.com/openai/codex/commit/554d22fecdec860db21fbd703a2f9d68cedf7869" + }, + { + "author": "jif-oai", + "committed_at": "2026-06-03T10:50:57Z", + "message": "larger patch", + "sha": "4484addb9ae097cb097ac3e4dcffa665a22845e2", + "url": "https://github.com/openai/codex/commit/4484addb9ae097cb097ac3e4dcffa665a22845e2" + } + ], + "default_branch": "main", + "docs_refs": [], + "examples_refs": [], + "extracted_flags": [ + "TODO", + "REALTIME_CONVERSATION_OPEN_TAG", + "API", + "SKILL", + "MCP" + ], + "files": [ + { + "additions": 1, + "deletions": 0, + "patch_excerpt": "@@ -2863,6 +2863,7 @@ name = \"codex-extension-api\"\n version = \"0.0.0\"\n dependencies = [\n \"async-trait\",\n+ \"codex-context-fragments\",\n \"codex-protocol\",\n \"codex-tools\",\n ]", + "path": "codex-rs/Cargo.lock", + "status": "modified" + }, + { + "additions": 2, + "deletions": 2, + "patch_excerpt": "@@ -19,7 +19,7 @@ impl AdditionalContextUserFragment {\n }\n \n impl ContextualUserFragment for AdditionalContextUserFragment {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"user\"\n }\n \n@@ -65,7 +65,7 @@ impl AdditionalContextDeveloperFragment {\n }\n \n impl ContextualUserFragment for AdditionalContextDeveloperFragment {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"developer\"\n }", + "path": "codex-rs/context-fragments/src/additional_context.rs", + "status": "modified" + }, + { + "additions": 14, + "deletions": 5, + "patch_excerpt": "@@ -44,9 +44,7 @@ impl FragmentRegistration for FragmentRegistrationPro\n /// in which case the default helpers render only the body and never match\n /// arbitrary text.\n pub trait ContextualUserFragment {\n- fn role() -> &'static str\n- where\n- Self: Sized;\n+ fn role(&self) -> &'static str;\n \n fn markers(&self) -> (&'static str, &'static str);\n \n@@ -80,7 +78,18 @@ pub trait ContextualUserFragment {\n {\n ResponseItem::Message {\n id: None,\n- role: Self::role().to_string(),\n+ role: self.role().to_string(),\n+ content: vec![ContentItem::InputText {\n+ text: self.render(),\n+ }],\n+ phase: None,\n+ }\n+ }\n+\n+ fn into_boxed_response_item(self: Box) -> ResponseItem {\n+ ResponseItem::Message {\n+ id: None,\n+ role: self....", + "path": "codex-rs/context-fragments/src/fragment.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -20,7 +20,7 @@ impl From<&SkillInjection> for SkillInstructions {\n }\n \n impl ContextualUserFragment for SkillInstructions {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"user\"\n }", + "path": "codex-rs/core-skills/src/skill_instructions.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -14,7 +14,7 @@ impl ApprovedCommandPrefixSaved {\n }\n \n impl ContextualUserFragment for ApprovedCommandPrefixSaved {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"developer\"\n }", + "path": "codex-rs/core/src/context/approved_command_prefix_saved.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -18,7 +18,7 @@ impl AppsInstructions {\n }\n \n impl ContextualUserFragment for AppsInstructions {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"developer\"\n }", + "path": "codex-rs/core/src/context/apps_instructions.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -22,7 +22,7 @@ impl AvailablePluginsInstructions {\n }\n \n impl ContextualUserFragment for AvailablePluginsInstructions {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"developer\"\n }", + "path": "codex-rs/core/src/context/available_plugins_instructions.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -21,7 +21,7 @@ impl From for AvailableSkillsInstructions {\n }\n \n impl ContextualUserFragment for AvailableSkillsInstructions {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"developer\"\n }", + "path": "codex-rs/core/src/context/available_skills_instructions.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -22,7 +22,7 @@ impl CollaborationModeInstructions {\n }\n \n impl ContextualUserFragment for CollaborationModeInstructions {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"developer\"\n }", + "path": "codex-rs/core/src/context/collaboration_mode_instructions.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -523,7 +523,7 @@ fn workspace_roots_from_turn_context_item(\n }\n \n impl ContextualUserFragment for EnvironmentContext {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"user\"\n }", + "path": "codex-rs/core/src/context/environment_context.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -4,7 +4,7 @@ use super::ContextualUserFragment;\n pub(crate) struct GuardianFollowupReviewReminder;\n \n impl ContextualUserFragment for GuardianFollowupReviewReminder {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"developer\"\n }", + "path": "codex-rs/core/src/context/guardian_followup_review_reminder.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -12,7 +12,7 @@ impl HookAdditionalContext {\n }\n \n impl ContextualUserFragment for HookAdditionalContext {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"developer\"\n }", + "path": "codex-rs/core/src/context/hook_additional_context.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -17,7 +17,7 @@ impl ImageGenerationInstructions {\n }\n \n impl ContextualUserFragment for ImageGenerationInstructions {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"developer\"\n }", + "path": "codex-rs/core/src/context/image_generation_instructions.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -76,7 +76,7 @@ impl InternalModelContextFragment {\n }\n \n impl ContextualUserFragment for InternalModelContextFragment {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"user\"\n }", + "path": "codex-rs/core/src/context/internal_model_context.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -5,7 +5,7 @@ use super::ContextualUserFragment;\n pub(crate) struct LegacyApplyPatchExecCommandWarning;\n \n impl ContextualUserFragment for LegacyApplyPatchExecCommandWarning {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"user\"\n }", + "path": "codex-rs/core/src/context/legacy_apply_patch_exec_command_warning.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -5,7 +5,7 @@ use super::ContextualUserFragment;\n pub(crate) struct LegacyModelMismatchWarning;\n \n impl ContextualUserFragment for LegacyModelMismatchWarning {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"user\"\n }", + "path": "codex-rs/core/src/context/legacy_model_mismatch_warning.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -5,7 +5,7 @@ use super::ContextualUserFragment;\n pub(crate) struct LegacyUnifiedExecProcessLimitWarning;\n \n impl ContextualUserFragment for LegacyUnifiedExecProcessLimitWarning {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"user\"\n }", + "path": "codex-rs/core/src/context/legacy_unified_exec_process_limit_warning.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -14,7 +14,7 @@ impl ModelSwitchInstructions {\n }\n \n impl ContextualUserFragment for ModelSwitchInstructions {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"developer\"\n }", + "path": "codex-rs/core/src/context/model_switch_instructions.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -18,7 +18,7 @@ impl NetworkRuleSaved {\n }\n \n impl ContextualUserFragment for NetworkRuleSaved {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"developer\"\n }", + "path": "codex-rs/core/src/context/network_rule_saved.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -12,7 +12,7 @@ impl PersonalitySpecInstructions {\n }\n \n impl ContextualUserFragment for PersonalitySpecInstructions {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"developer\"\n }", + "path": "codex-rs/core/src/context/personality_spec_instructions.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -12,7 +12,7 @@ impl PluginInstructions {\n }\n \n impl ContextualUserFragment for PluginInstructions {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"developer\"\n }", + "path": "codex-rs/core/src/context/plugin_instructions.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -17,7 +17,7 @@ impl RealtimeEndInstructions {\n }\n \n impl ContextualUserFragment for RealtimeEndInstructions {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"developer\"\n }", + "path": "codex-rs/core/src/context/realtime_end_instructions.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -7,7 +7,7 @@ use codex_protocol::protocol::REALTIME_CONVERSATION_OPEN_TAG;\n pub(crate) struct RealtimeStartInstructions;\n \n impl ContextualUserFragment for RealtimeStartInstructions {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"developer\"\n }", + "path": "codex-rs/core/src/context/realtime_start_instructions.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -16,7 +16,7 @@ impl RealtimeStartWithInstructions {\n }\n \n impl ContextualUserFragment for RealtimeStartWithInstructions {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"developer\"\n }", + "path": "codex-rs/core/src/context/realtime_start_with_instructions.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -18,7 +18,7 @@ impl SubagentNotification {\n }\n \n impl ContextualUserFragment for SubagentNotification {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"user\"\n }", + "path": "codex-rs/core/src/context/subagent_notification.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -17,7 +17,7 @@ impl TurnAborted {\n }\n \n impl ContextualUserFragment for TurnAborted {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"user\"\n }", + "path": "codex-rs/core/src/context/turn_aborted.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -7,7 +7,7 @@ pub(crate) struct UserInstructions {\n }\n \n impl ContextualUserFragment for UserInstructions {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"user\"\n }", + "path": "codex-rs/core/src/context/user_instructions.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -27,7 +27,7 @@ impl UserShellCommand {\n }\n \n impl ContextualUserFragment for UserShellCommand {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"user\"\n }", + "path": "codex-rs/core/src/context/user_shell_command.rs", + "status": "modified" + }, + { + "additions": 6, + "deletions": 2, + "patch_excerpt": "@@ -628,7 +628,7 @@ async fn build_extension_turn_input_items(\n \n let mut items = Vec::new();\n for contributor in contributors {\n- let contributed_items = contributor\n+ let contributed_fragments = contributor\n .contribute(\n input.clone(),\n &sess.services.session_extension_data,\n@@ -638,7 +638,11 @@ async fn build_extension_turn_input_items(\n .or_cancel(cancellation_token)\n .await\n .ok()?;\n- items.extend(contributed_items);\n+ items.extend(\n+ contributed_fragments\n+ .into_iter()\n+ .map(ContextualUserFragment::into_boxed_response_item),\n+ );\n }\n \n Some(items)", + "path": "codex-rs/core/src/session/turn.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 0, + "patch_excerpt": "@@ -15,5 +15,6 @@ workspace = true\n \n [dependencies]\n async-trait = { workspace = true }\n+codex-context-fragments = { workspace = true }\n codex-protocol = { workspace = true }\n codex-tools = { workspace = true }", + "path": "codex-rs/ext/extension-api/Cargo.toml", + "status": "modified" + }, + { + "additions": 3, + "deletions": 3, + "patch_excerpt": "@@ -1,8 +1,8 @@\n use std::future::Future;\n use std::sync::Arc;\n \n+use codex_context_fragments::ContextualUserFragment;\n use codex_protocol::items::TurnItem;\n-use codex_protocol::models::ResponseItem;\n use codex_protocol::protocol::ReviewDecision;\n use codex_protocol::protocol::TokenUsageInfo;\n use codex_tools::ToolCall;\n@@ -98,14 +98,14 @@ pub trait TurnLifecycleContributor: Send + Sync {\n /// host, not in this input.\n #[async_trait::async_trait]\n pub trait TurnInputContributor: Send + Sync {\n- /// Returns additional model input items for one submitted turn.\n+ /// Returns additional contextual fragments for one submitted turn.\n async fn contribute(\n &self,\n input: TurnInputContext,\n session_store: &ExtensionData,\n thread_store: &ExtensionData,\n turn_store: &ExtensionData,\n- ) -> Vec;\n+ ) -> Vec for SkillsExten...", + "path": "codex-rs/ext/skills/src/extension.rs", + "status": "modified" + }, + { + "additions": 0, + "deletions": 11, + "patch_excerpt": "@@ -16,17 +16,6 @@ pub struct SkillListQuery {\n pub include_remote_skills: bool,\n }\n \n-impl SkillListQuery {\n- pub(crate) fn placeholder_for_turn(turn_id: &str) -> Self {\n- Self {\n- turn_id: turn_id.to_string(),\n- executor_authorities: Vec::new(),\n- include_host_skills: true,\n- include_remote_skills: true,\n- }\n- }\n-}\n-\n #[derive(Clone, Debug, PartialEq, Eq)]\n pub struct SkillReadRequest {\n pub authority: SkillAuthority,", + "path": "codex-rs/ext/skills/src/provider.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -143,7 +143,7 @@ impl PermissionsInstructions {\n }\n \n impl ContextualUserFragment for PermissionsInstructions {\n- fn role() -> &'static str {\n+ fn role(&self) -> &'static str {\n \"developer\"\n }", + "path": "codex-rs/prompts/src/permissions_instructions.rs", + "status": "modified" + } + ], + "linked_issues": [], + "notes": [ + "Built from GitHub pull-request, commits, files, and repo endpoints." + ], + "primary_pr": { + "body": "## Why\n\nThe skills extension needs the resolved turn environments to build a real per-turn `SkillListQuery`. The previous `TurnLifecycleContributor` hook only had a turn id, so it could only seed a placeholder query and never carry the executor authorities that executor-scoped skill routing will need.\n\nMoving catalog resolution onto `TurnInputContributor` puts the skills extension on the same turn-preparation path that already has the environment ids and working directories for the submitted turn, while keeping the actual prompt injection work for follow-up changes.\n\n## What changed\n\n- switch `ext/skills` from `TurnLifecycleContributor` to `TurnInputContributor`\n- build `executor_authorities` from `TurnInputContext.environments` and pass them through `SkillListQuery`\n- keep storing the resolved catalog in `SkillsTurnState`, but drop the placeholder query helper that no longer matches the real data flow\n- update the extension TODOs to reflect that per-turn catalog resolution now happens in the turn-input contributor, and that prompt/context injection still needs to move later\n\n## Testing\n\n- Not run locally.\n", + "labels": [], + "merged_at": "2026-06-03T11:32:56Z", + "number": 26106, + "state": "merged", + "title": "skills: resolve per-turn catalogs from turn input context", + "url": "https://github.com/openai/codex/pull/26106" + }, + "repo": "openai/codex", + "schema": "github_change_bundle/v1" +} diff --git a/artifacts/github/bundles/openai-codex-pr-26254.json b/artifacts/github/bundles/openai-codex-pr-26254.json new file mode 100644 index 0000000..0163395 --- /dev/null +++ b/artifacts/github/bundles/openai-codex-pr-26254.json @@ -0,0 +1,86 @@ +{ + "analysis_mode": "pr_first", + "commits": [ + { + "author": "jif-oai", + "committed_at": "2026-06-03T21:35:52Z", + "message": "feat: catalog multi-agent v2 config", + "sha": "c677bf1f9c6b263c185fd65a4fe8da2a1eb8fed1", + "url": "https://github.com/openai/codex/commit/c677bf1f9c6b263c185fd65a4fe8da2a1eb8fed1" + }, + { + "author": "jif-oai", + "committed_at": "2026-06-03T21:56:25Z", + "message": "cleaning", + "sha": "a44923c056afdde77ad82f620825d95df392e0f1", + "url": "https://github.com/openai/codex/commit/a44923c056afdde77ad82f620825d95df392e0f1" + } + ], + "default_branch": "main", + "docs_refs": [], + "examples_refs": [], + "extracted_flags": [ + "--lib", + "CONFIG_TOML_FILE", + "DEFAULT_AGENT_MAX_THREADS" + ], + "files": [ + { + "additions": 2, + "deletions": 6, + "patch_excerpt": "@@ -231,9 +231,7 @@ impl AgentControl {\n &config,\n )\n .await;\n- let agent_max_threads = config\n- .effective_agent_max_threads(multi_agent_version)\n- .map_err(|err| CodexErr::InvalidRequest(err.to_string()))?;\n+ let agent_max_threads = config.effective_agent_max_threads(multi_agent_version);\n let mut reservation = self.state.reserve_spawn_slot(agent_max_threads)?;\n let inheritance = SpawnAgentThreadInheritance {\n shell_snapshot: self\n@@ -632,9 +630,7 @@ impl AgentControl {\n &config,\n )\n .await;\n- let agent_max_threads = config\n- .effective_agent_max_threads(multi_agent_version)\n- .map_err(|err| CodexErr::InvalidRequest(err.to_string()))?;\n+ let agent_max_threads = config.effective_agent_max_threads(multi_agent_v...", + "path": "codex-rs/core/src/agent/control.rs", + "status": "modified" + }, + { + "additions": 38, + "deletions": 6, + "patch_excerpt": "@@ -9836,7 +9836,7 @@ non_code_mode_only = true\n assert_eq!(\n (\n config.agent_max_threads,\n- config.effective_agent_max_threads(MultiAgentVersion::V2)?\n+ config.effective_agent_max_threads(MultiAgentVersion::V2)\n ),\n (None, Some(4))\n );\n@@ -9886,7 +9886,7 @@ enabled = true\n assert_eq!(\n (\n config.agent_max_threads,\n- config.effective_agent_max_threads(MultiAgentVersion::V2)?\n+ config.effective_agent_max_threads(MultiAgentVersion::V2)\n ),\n (None, Some(3))\n );\n@@ -9945,7 +9945,7 @@ subagent_usage_hint_text = \"\"\n }\n \n #[tokio::test]\n-async fn multi_agent_v2_rejects_agents_max_threads() -> std::io::Result<()> {\n+async fn multi_agent_v2_feature_rejects_agents_max_threads() -> std::io::Result<()> {\n let codex_home = TempDir::new()?;\n std::fs::write(\n ...", + "path": "codex-rs/core/src/config/config_tests.rs", + "status": "modified" + }, + { + "additions": 18, + "deletions": 15, + "patch_excerpt": "@@ -1292,26 +1292,29 @@ impl Config {\n }\n }\n \n+ pub(crate) fn validate_multi_agent_v2_config(&self) -> std::io::Result<()> {\n+ if self.features.enabled(Feature::MultiAgentV2) && self.agent_max_threads.is_some() {\n+ Err(std::io::Error::new(\n+ std::io::ErrorKind::InvalidInput,\n+ \"agents.max_threads cannot be set when features.multi_agent_v2 is enabled\",\n+ ))\n+ } else {\n+ Ok(())\n+ }\n+ }\n+\n pub(crate) fn effective_agent_max_threads(\n &self,\n multi_agent_version: MultiAgentVersion,\n- ) -> std::io::Result> {\n+ ) -> Option {\n match multi_agent_version {\n- MultiAgentVersion::V2 => {\n- if self.agent_max_threads.is_some() {\n- return Err(std::io::Error::new(\n- std::io::ErrorKin...", + "path": "codex-rs/core/src/config/mod.rs", + "status": "modified" + }, + { + "additions": 2, + "deletions": 5, + "patch_excerpt": "@@ -557,11 +557,8 @@ impl Codex {\n .await;\n let multi_agent_version =\n resolve_multi_agent_version(&conversation_history, inherited_multi_agent_version);\n- let startup_multi_agent_version = multi_agent_version\n- .or(model_info.multi_agent_version)\n- .unwrap_or_else(|| config.multi_agent_version_from_features());\n- let _ = config\n- .effective_agent_max_threads(startup_multi_agent_version)\n+ config\n+ .validate_multi_agent_v2_config()\n .map_err(|err| CodexErr::InvalidRequest(err.to_string()))?;\n let base_instructions = config\n .base_instructions", + "path": "codex-rs/core/src/session/mod.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 4, + "patch_excerpt": "@@ -116,10 +116,7 @@ async fn build_runner_options(\n \"multi-agent runtime is disabled; this session cannot spawn workers\".to_string(),\n ));\n }\n- let agent_max_threads = turn\n- .config\n- .effective_agent_max_threads(multi_agent_version)\n- .map_err(|err| FunctionCallError::Fatal(err.to_string()))?;\n+ let agent_max_threads = turn.config.effective_agent_max_threads(multi_agent_version);\n if agent_max_threads == Some(0) {\n return Err(FunctionCallError::RespondToModel(\n \"agent thread limit reached; this session cannot spawn more subagents\".to_string(),", + "path": "codex-rs/core/src/tools/handlers/agent_jobs.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 0, + "patch_excerpt": "@@ -190,6 +190,7 @@ async fn remote_multi_agent_selector_overrides_feature_flags() -> Result<()> {\n let mut v2_model = remote_model(\"test-multi-agent-v2\");\n v2_model.multi_agent_version = Some(MultiAgentVersion::V2);\n let v2_body = response_body_for_remote_model(v2_model, |config| {\n+ config.agent_max_threads = Some(3);\n config\n .features\n .enable(Feature::Collab)", + "path": "codex-rs/core/tests/suite/model_runtime_selectors.rs", + "status": "modified" + } + ], + "linked_issues": [], + "notes": [ + "Built from GitHub pull-request, commits, files, and repo endpoints." + ], + "primary_pr": { + "body": "## Why\n\nModel metadata can now select multi-agent v2 even when a user has not enabled `features.multi_agent_v2` in their config. Some existing configs still set the legacy `agents.max_threads` knob for v1 multi-agent behavior, so treating every v2 runtime as incompatible with `agents.max_threads` would break users whose only v2 signal came from the model catalog.\n\nThe incompatible configuration is specifically enabling `features.multi_agent_v2` while also setting `agents.max_threads`. Catalog-forced v2 should use the v2 concurrency setting and ignore the legacy v1 cap instead of rejecting the config.\n\n## What changed\n\n- Split config validation from runtime concurrency calculation: `effective_agent_max_threads` now just returns the effective cap for the resolved multi-agent runtime.\n- Added explicit validation for `features.multi_agent_v2` + `agents.max_threads` at session startup.\n- Preserved catalog-selected v2 behavior when `features.multi_agent_v2` is disabled, so existing configs with `agents.max_threads` keep starting.\n- Updated model-runtime selector coverage so a catalog v2 model still exposes v2 tools even when `agents.max_threads` is set and the config flag is disabled.\n\n## Validation\n\n- `cargo check -p codex-core --lib`\n- `just test -p codex-core --lib -E \"test(multi_agent_v2_feature_rejects_agents_max_threads) | test(catalog_v2_allows_agents_max_threads_when_feature_disabled)\"`\n", + "labels": [], + "merged_at": "2026-06-03T22:24:40Z", + "number": 26254, + "state": "merged", + "title": "feat: catalog multi-agent v2 config", + "url": "https://github.com/openai/codex/pull/26254" + }, + "repo": "openai/codex", + "schema": "github_change_bundle/v1" +} diff --git a/artifacts/github/impact/openai-codex-pr-25469.json b/artifacts/github/impact/openai-codex-pr-25469.json new file mode 100644 index 0000000..8a0e748 --- /dev/null +++ b/artifacts/github/impact/openai-codex-pr-25469.json @@ -0,0 +1,45 @@ +{ + "schema": "upstream_impact/v1", + "slug": "openai-codex-pr-25469", + "repo": "openai/codex", + "source_refs": { + "items": [ + { + "kind": "pull_request", + "title": "[profile-switcher][rust] -- [1/2] Add app-server account session protocol", + "url": "https://github.com/openai/codex/pull/25469", + "meta": "Merged 2026-06-03T19:55:12Z" + }, + { + "kind": "pull_request", + "title": "Source-backed Decodex upstream review", + "url": "https://github.com/openai/codex/pull/25469", + "meta": "artifacts/github/reviews/openai-codex-pr-25469.review.json" + } + ] + }, + "observed_change": "Codex added app-server v2 accountSession protocol types for Desktop profile switching plus backend account metadata fetching for workspace choices.", + "public_signal_decision": "defer", + "control_plane_impact": "candidate", + "publisher_angle": "watch_note", + "confidence": "confirmed", + "evidence": [ + "The PR body scopes the change to accountSession protocol and backend account metadata client support.", + "The v2 account protocol adds account-session add, list, logout, switch, and metadata response structures.", + "The backend client adds get_accounts_check and account metadata parsing for Codex API and ChatGPT API path styles.", + "The PR explicitly defers app-server lifecycle behavior and consolidated saved-session storage to follow-up PR #25383." + ], + "candidate_followups": [ + "Track PR #25383 before creating Decodex implementation work for account-session lifecycle support.", + "Audit Decodex app-server account handling for future accountSession method names and metadata shapes.", + "Keep public content cautious until lifecycle behavior is source-confirmed." + ], + "social_notes": [ + "Frame as protocol groundwork for Desktop profile switching, not complete account switching behavior.", + "Mention that lifecycle/storage is intentionally in a follow-up PR." + ], + "caveats": [ + "The PR says tests were not run per requested scope.", + "Lifecycle behavior is deferred, so this is not a complete user workflow by itself." + ] +} diff --git a/artifacts/github/impact/openai-codex-pr-26106.json b/artifacts/github/impact/openai-codex-pr-26106.json new file mode 100644 index 0000000..f035ea1 --- /dev/null +++ b/artifacts/github/impact/openai-codex-pr-26106.json @@ -0,0 +1,45 @@ +{ + "schema": "upstream_impact/v1", + "slug": "openai-codex-pr-26106", + "repo": "openai/codex", + "source_refs": { + "items": [ + { + "kind": "pull_request", + "title": "skills: resolve per-turn catalogs from turn input context", + "url": "https://github.com/openai/codex/pull/26106", + "meta": "Merged 2026-06-03T11:32:56Z" + }, + { + "kind": "pull_request", + "title": "Source-backed Decodex upstream review", + "url": "https://github.com/openai/codex/pull/26106", + "meta": "artifacts/github/reviews/openai-codex-pr-26106.review.json" + } + ] + }, + "observed_change": "Codex moved skills catalog resolution from a turn-lifecycle placeholder into the turn-input contributor path so SkillListQuery can include per-turn executor authorities.", + "public_signal_decision": "defer", + "control_plane_impact": "watch", + "publisher_angle": "watch_note", + "confidence": "confirmed", + "evidence": [ + "The PR body says per-turn catalog resolution now uses turn environments and working directories, while prompt/context injection remains follow-up work.", + "The skills extension now implements TurnInputContributor and builds executor_authorities from TurnInputContext.environments.", + "The placeholder SkillListQuery helper was removed.", + "The extension API now returns contextual fragments for turn input contribution." + ], + "candidate_followups": [ + "Watch for the follow-up PR that injects resolved skills into model context.", + "Avoid publishing a try-now signal until a complete user-facing skills path is source-confirmed.", + "If Decodex mirrors upstream extension APIs, audit ResponseItem contributor assumptions." + ], + "social_notes": [ + "Only use as a watch note unless later PRs complete the skills user path.", + "The strongest public framing is that upstream skills work is moving toward per-turn, executor-aware catalogs." + ], + "caveats": [ + "The PR says tests were not run locally.", + "Prompt injection and user-facing behavior are explicitly deferred." + ] +} diff --git a/artifacts/github/impact/openai-codex-pr-26254.json b/artifacts/github/impact/openai-codex-pr-26254.json new file mode 100644 index 0000000..e51b8fa --- /dev/null +++ b/artifacts/github/impact/openai-codex-pr-26254.json @@ -0,0 +1,45 @@ +{ + "schema": "upstream_impact/v1", + "slug": "openai-codex-pr-26254", + "repo": "openai/codex", + "source_refs": { + "items": [ + { + "kind": "pull_request", + "title": "feat: catalog multi-agent v2 config", + "url": "https://github.com/openai/codex/pull/26254", + "meta": "Merged 2026-06-03T22:24:40Z" + }, + { + "kind": "pull_request", + "title": "Source-backed Decodex upstream review", + "url": "https://github.com/openai/codex/pull/26254", + "meta": "artifacts/github/reviews/openai-codex-pr-26254.review.json" + } + ] + }, + "observed_change": "Codex now validates only explicit features.multi_agent_v2 plus agents.max_threads as incompatible while allowing catalog-selected MultiAgentV2 models to ignore the legacy v1 thread cap.", + "public_signal_decision": "publish", + "control_plane_impact": "compat_risk", + "publisher_angle": "practical_explainer", + "confidence": "confirmed", + "evidence": [ + "The PR body defines the incompatible config as explicitly enabling features.multi_agent_v2 while also setting agents.max_threads.", + "Config validation now performs that explicit-feature check separately from runtime thread-cap calculation.", + "Session startup calls validate_multi_agent_v2_config, and catalog-selected v2 keeps starting with agents.max_threads present.", + "Model-runtime selector coverage adds agent_max_threads while a remote model selects MultiAgentV2." + ], + "candidate_followups": [ + "Audit Decodex MultiAgentV2 generated guidance for statements that all v2 sessions reject agents.max_threads.", + "If Decodex reads upstream model metadata, preserve the distinction between catalog-selected v2 and user-enabled features.multi_agent_v2.", + "Use this as release-rollup evidence for MultiAgentV2 migration behavior." + ], + "social_notes": [ + "Frame as a practical config compatibility update for MultiAgentV2 users.", + "Mention that explicit features.multi_agent_v2 plus agents.max_threads is still invalid, while catalog-selected v2 is allowed." + ], + "caveats": [ + "The behavior depends on upstream model metadata selecting v2.", + "This does not prove Decodex has adopted upstream model-runtime selectors." + ] +} diff --git a/artifacts/github/review-queue/openai-codex-latest.json b/artifacts/github/review-queue/openai-codex-latest.json index b069562..42559dc 100644 --- a/artifacts/github/review-queue/openai-codex-latest.json +++ b/artifacts/github/review-queue/openai-codex-latest.json @@ -1,14 +1,14 @@ { "counts": { - "critical": 15, - "high": 7, + "critical": 12, + "high": 14, "low": 1, - "normal": 17, + "normal": 13, "published_subjects_seen": 0, "recent_commits_scanned": 40, "subjects_queued": 40 }, - "generated_at": "2026-06-02T08:52:30.248308Z", + "generated_at": "2026-06-04T13:05:00.398536Z", "repo": "openai/codex", "schema": "upstream_review_queue/v1", "source": { @@ -19,211 +19,232 @@ "subjects": [ { "attention_flags": [ + "auth_account", "breaking_change", "new_feature", "protocol_change", - "security_policy" + "release_packaging" ], - "changed_file_count": 11, + "changed_file_count": 13, "commit_shas": [ - "c9bdb5255b2b4b5d365a1be3ec3a94e34a4e0af0" - ], - "committed_at": "2026-06-01T17:57:11Z", + "9f93a26762d54a4a8317986dc72be16b693d5406", + "3abb821114c873e9b7f1037da24771921f48fdfc", + "9d450c546e4266ff71f913d09c937cb2a5655aee", + "8c7217e6f0b1cc0c8cbf41077e3de034d7a6d7d2", + "c7815b9b696ea80a1f2274fb0af77dcae191ce96", + "231c0f60ab7e04ec418c8ed5629a3697046af9c8", + "86291e0c7bf9fd7f19f54826fdacc5978db355b7", + "5dc2c6e3e8a0d313e2fded4c405be540715bd159" + ], + "committed_at": "2026-06-02T23:10:26Z", "next_step": "ai_review_required", - "pr_number": 25636, - "pr_url": "https://github.com/openai/codex/pull/25636", + "pr_number": 25953, + "pr_url": "https://github.com/openai/codex/pull/25953", "review_priority": "critical", - "review_reason": "Needs AI review for breaking_change, new_feature, protocol_change, security_policy.", + "review_reason": "Needs AI review for auth_account, breaking_change, new_feature, protocol_change, release_packaging.", "sample_paths": [ - "codex-rs/core/src/config/mod.rs", - "codex-rs/core/src/tools/handlers/multi_agents_spec.rs", - "codex-rs/core/src/tools/handlers/multi_agents_spec_tests.rs", - "codex-rs/core/src/tools/handlers/multi_agents_tests.rs", - "codex-rs/core/src/tools/handlers/multi_agents_v2.rs", - "codex-rs/core/src/tools/handlers/multi_agents_v2/followup_task.rs", - "codex-rs/core/src/tools/handlers/multi_agents_v2/message_tool.rs", - "codex-rs/core/src/tools/spec_plan.rs", - "codex-rs/core/src/tools/spec_plan_tests.rs", - "codex-rs/rollout-trace/README.md", - "codex-rs/rollout-trace/src/tool_dispatch.rs" + "codex-rs/Cargo.lock", + "codex-rs/Cargo.toml", + "codex-rs/ext/skills/BUILD.bazel", + "codex-rs/ext/skills/Cargo.toml", + "codex-rs/ext/skills/src/catalog.rs", + "codex-rs/ext/skills/src/extension.rs", + "codex-rs/ext/skills/src/lib.rs", + "codex-rs/ext/skills/src/provider.rs", + "codex-rs/ext/skills/src/providers/executor.rs", + "codex-rs/ext/skills/src/providers/host.rs", + "codex-rs/ext/skills/src/providers/mod.rs", + "codex-rs/ext/skills/src/providers/remote.rs" ], "source_state": "merged", - "subject_id": "25636", + "subject_id": "25953", "subject_kind": "pr", "surface_hints": [ "config_hooks", - "docs_examples", - "tests_ci" + "model_provider" ], - "title": "[codex] Rename multi-agent v2 assign_task to followup_task", - "url": "https://github.com/openai/codex/pull/25636" + "title": "feat: add skills extension scaffold", + "url": "https://github.com/openai/codex/pull/25953" }, { "attention_flags": [ + "auth_account", "breaking_change", + "deprecated_removed", "new_feature", - "protocol_change" + "protocol_change", + "security_policy" ], - "changed_file_count": 5, + "changed_file_count": 18, "commit_shas": [ - "b6cfa856ffde6de7256525f1f162e911b60ecf51" - ], - "committed_at": "2026-06-01T18:04:21Z", + "5de6ebd5afb62c89b76c5e809517b0e23c4f3169", + "f5b2f3af6873915944b2175b1aba8cb4355f4b7b", + "e9586bf088b81c6fe848e1de1ec1f3adb9646645", + "cd77d7450ff87fdd80562d27b96e1e008477ce05", + "24206f3c20f339cd74ede237cbc148cb78a56b11", + "bb9987c9d370a27debf7ab76de57d3cea4f2de8e" + ], + "committed_at": "2026-06-03T00:01:02Z", "next_step": "ai_review_required", - "pr_number": 25491, - "pr_url": "https://github.com/openai/codex/pull/25491", + "pr_number": 25785, + "pr_url": "https://github.com/openai/codex/pull/25785", "review_priority": "critical", - "review_reason": "Needs AI review for breaking_change, new_feature, protocol_change.", + "review_reason": "Needs AI review for auth_account, breaking_change, deprecated_removed, new_feature, protocol_change, security_policy.", "sample_paths": [ - "codex-rs/Cargo.lock", - "codex-rs/chatgpt/src/connectors.rs", - "codex-rs/core-plugins/Cargo.toml", - "codex-rs/core-plugins/src/loader.rs", - "codex-rs/core-plugins/src/manager_tests.rs" + "codex-rs/app-server-protocol/src/export.rs", + "codex-rs/app-server-protocol/src/protocol/common.rs", + "codex-rs/app-server-protocol/src/protocol/v2/remote_control.rs", + "codex-rs/app-server-protocol/src/protocol/v2/remote_control_tests.rs", + "codex-rs/app-server-transport/src/transport/remote_control/auth.rs", + "codex-rs/app-server-transport/src/transport/remote_control/clients.rs", + "codex-rs/app-server-transport/src/transport/remote_control/enroll.rs", + "codex-rs/app-server-transport/src/transport/remote_control/mod.rs", + "codex-rs/app-server-transport/src/transport/remote_control/protocol.rs", + "codex-rs/app-server-transport/src/transport/remote_control/tests.rs", + "codex-rs/app-server-transport/src/transport/remote_control/tests/clients_tests.rs", + "codex-rs/app-server-transport/src/transport/remote_control/websocket.rs" ], "source_state": "merged", - "subject_id": "25491", + "subject_id": "25785", "subject_kind": "pr", "surface_hints": [ - "config_hooks", - "mcp_plugins", + "app_server_protocol", + "auth_accounts", + "cli_tui", + "docs_examples", "tests_ci" ], - "title": "Preserve plugin app manifest order", - "url": "https://github.com/openai/codex/pull/25491" + "title": "feat(app-server): add remote control client management RPCs", + "url": "https://github.com/openai/codex/pull/25785" }, { "attention_flags": [ "auth_account", "breaking_change", + "deprecated_removed", "new_feature", "protocol_change", "release_packaging", "security_policy" ], - "changed_file_count": 55, + "changed_file_count": 35, "commit_shas": [ - "e99b34a73a62caf181c2743accdbcb4800604612" + "7eff30bf8e3ecdc87e8fe95f089a666f3f95ba1f", + "554d22fecdec860db21fbd703a2f9d68cedf7869", + "4484addb9ae097cb097ac3e4dcffa665a22845e2" ], - "committed_at": "2026-06-01T18:45:07Z", + "committed_at": "2026-06-03T11:32:55Z", "next_step": "ai_review_required", - "pr_number": 25151, - "pr_url": "https://github.com/openai/codex/pull/25151", + "pr_number": 26106, + "pr_url": "https://github.com/openai/codex/pull/26106", "review_priority": "critical", - "review_reason": "Needs AI review for auth_account, breaking_change, new_feature, protocol_change, release_packaging, security_policy.", + "review_reason": "Needs AI review for auth_account, breaking_change, deprecated_removed, new_feature, protocol_change, release_packaging, security_policy.", "sample_paths": [ - ".github/CODEOWNERS", "codex-rs/Cargo.lock", - "codex-rs/Cargo.toml", - "codex-rs/apply-patch/BUILD.bazel", - "codex-rs/apply-patch/src/lib.rs", - "codex-rs/core/BUILD.bazel", - "codex-rs/core/Cargo.toml", - "codex-rs/core/src/agents_md.rs", - "codex-rs/core/src/client_common.rs", - "codex-rs/core/src/compact.rs", - "codex-rs/core/src/context/permissions_instructions.rs", - "codex-rs/core/src/context/realtime_end_instructions.rs" + "codex-rs/context-fragments/src/additional_context.rs", + "codex-rs/context-fragments/src/fragment.rs", + "codex-rs/core-skills/src/skill_instructions.rs", + "codex-rs/core/src/context/approved_command_prefix_saved.rs", + "codex-rs/core/src/context/apps_instructions.rs", + "codex-rs/core/src/context/available_plugins_instructions.rs", + "codex-rs/core/src/context/available_skills_instructions.rs", + "codex-rs/core/src/context/collaboration_mode_instructions.rs", + "codex-rs/core/src/context/environment_context.rs", + "codex-rs/core/src/context/guardian_followup_review_reminder.rs", + "codex-rs/core/src/context/hook_additional_context.rs" ], "source_state": "merged", - "subject_id": "25151", + "subject_id": "26106", "subject_kind": "pr", "surface_hints": [ - "cli_tui", "config_hooks", - "sandbox_permissions", - "tests_ci" + "mcp_plugins", + "model_provider", + "sandbox_permissions" ], - "title": "[codex] Consolidate shared prompts in codex-prompts", - "url": "https://github.com/openai/codex/pull/25151" + "title": "skills: resolve per-turn catalogs from turn input context", + "url": "https://github.com/openai/codex/pull/26106" }, { "attention_flags": [ "auth_account", "breaking_change", - "deprecated_removed", "new_feature", "protocol_change", "security_policy" ], - "changed_file_count": 14, + "changed_file_count": 40, "commit_shas": [ - "5ab860f8677eb0a0b4bdf7053af5c724dff8549a", - "7622e229a25c9c93114d3434eb94af9880fe42fa", - "385010e2764ee04fab2e0677369b6d1534145b7f", - "111adfbdb61ed3437ff0140633662aadb5d26dfd", - "2d3b3e85ff37e6f89e801b727bdbe8a04e08b592" + "14f0061a25abe6ca5d6559c142a7497c562b7b78", + "10b2dd2c3949a3b8c846ed61e4f88edda1080a8c", + "ae7c2449dc9a5b0f94014344360935c99e37a119" ], - "committed_at": "2026-06-01T18:53:31Z", + "committed_at": "2026-06-03T13:38:30Z", "next_step": "ai_review_required", - "pr_number": 25149, - "pr_url": "https://github.com/openai/codex/pull/25149", + "pr_number": 26156, + "pr_url": "https://github.com/openai/codex/pull/26156", "review_priority": "critical", - "review_reason": "Needs AI review for auth_account, breaking_change, deprecated_removed, new_feature, protocol_change, security_policy.", + "review_reason": "Needs AI review for auth_account, breaking_change, new_feature, protocol_change, security_policy.", "sample_paths": [ - "codex-rs/config/src/loader/tests.rs", - "codex-rs/exec-server/src/client.rs", - "codex-rs/exec-server/src/environment_path.rs", - "codex-rs/exec-server/src/fs_helper.rs", - "codex-rs/exec-server/src/lib.rs", - "codex-rs/exec-server/src/local_file_system.rs", - "codex-rs/exec-server/src/protocol.rs", - "codex-rs/exec-server/src/remote_file_system.rs", - "codex-rs/exec-server/src/sandboxed_file_system.rs", - "codex-rs/exec-server/src/server/file_system_handler.rs", - "codex-rs/exec-server/src/server/handler.rs", - "codex-rs/exec-server/src/server/registry.rs" + "codex-rs/core/src/agent/agent_resolver.rs", + "codex-rs/core/src/codex_delegate.rs", + "codex-rs/core/src/compact.rs", + "codex-rs/core/src/goals.rs", + "codex-rs/core/src/guardian/prompt.rs", + "codex-rs/core/src/guardian/review.rs", + "codex-rs/core/src/guardian/review_session.rs", + "codex-rs/core/src/guardian/tests.rs", + "codex-rs/core/src/hook_runtime.rs", + "codex-rs/core/src/mcp_tool_call.rs", + "codex-rs/core/src/mcp_tool_call_tests.rs", + "codex-rs/core/src/realtime_conversation.rs" ], "source_state": "merged", - "subject_id": "25149", + "subject_id": "26156", "subject_kind": "pr", "surface_hints": [ - "app_server_protocol", - "cli_tui", "config_hooks", - "sandbox_permissions", + "mcp_plugins", + "release_packaging", "tests_ci" ], - "title": "exec-server: canonicalize bound filesystem paths", - "url": "https://github.com/openai/codex/pull/25149" + "title": "chore: mechanical rename", + "url": "https://github.com/openai/codex/pull/26156" }, { "attention_flags": [ "auth_account", "deprecated_removed", - "new_feature", - "protocol_change" + "protocol_change", + "release_packaging", + "security_policy" ], - "changed_file_count": 9, + "changed_file_count": 4, "commit_shas": [ - "d89349d83c99e01045855e92319b00ca4179969e" + "6bd3a19109285601e7d4467ff3b249baba70437c", + "7846f2582e94ec27ec701280059fa2635e4f31e2" ], - "committed_at": "2026-06-01T20:01:36Z", + "committed_at": "2026-06-03T16:21:24Z", "next_step": "ai_review_required", - "pr_number": 24979, - "pr_url": "https://github.com/openai/codex/pull/24979", + "pr_number": 25949, + "pr_url": "https://github.com/openai/codex/pull/25949", "review_priority": "critical", - "review_reason": "Needs AI review for auth_account, deprecated_removed, new_feature, protocol_change.", + "review_reason": "Needs AI review for auth_account, deprecated_removed, protocol_change, release_packaging, security_policy.", "sample_paths": [ - "codex-rs/core/config.schema.json", - "codex-rs/core/src/session/mod.rs", - "codex-rs/core/src/session/review.rs", - "codex-rs/core/src/session/turn_context.rs", - "codex-rs/core/src/tools/spec_plan_tests.rs", - "codex-rs/features/src/lib.rs", - "codex-rs/tools/src/lib.rs", - "codex-rs/tools/src/tool_config.rs", - "codex-rs/tools/src/tool_config_tests.rs" + "codex-rs/windows-sandbox-rs/BUILD.bazel", + "codex-rs/windows-sandbox-rs/Cargo.toml", + "codex-rs/windows-sandbox-rs/build.rs", + "codex-rs/windows-sandbox-rs/codex-windows-sandbox-setup.manifest" ], "source_state": "merged", - "subject_id": "24979", + "subject_id": "25949", "subject_kind": "pr", "surface_hints": [ "config_hooks", - "tests_ci" + "sandbox_permissions" ], - "title": "feat: gate unified exec zsh fork composition", - "url": "https://github.com/openai/codex/pull/24979" + "title": "[codex] Restore setup helper UAC manifest", + "url": "https://github.com/openai/codex/pull/25949" }, { "attention_flags": [ @@ -234,489 +255,368 @@ "protocol_change", "security_policy" ], - "changed_file_count": 69, + "changed_file_count": 10, "commit_shas": [ - "7b49072e058c4bd8a25a21bbfd7f908c3a3b90d5" + "4790d5f24cef8cf925dd53057f22b1139881c8f6" ], - "committed_at": "2026-06-01T21:49:38Z", + "committed_at": "2026-06-03T17:41:41Z", "next_step": "ai_review_required", - "pr_number": 25701, - "pr_url": "https://github.com/openai/codex/pull/25701", + "pr_number": 25700, + "pr_url": "https://github.com/openai/codex/pull/25700", "review_priority": "critical", "review_reason": "Needs AI review for auth_account, breaking_change, deprecated_removed, new_feature, protocol_change, security_policy.", "sample_paths": [ - "codex-rs/app-server/tests/common/lib.rs", - "codex-rs/app-server/tests/common/test_app_server.rs", - "codex-rs/app-server/tests/suite/auth.rs", - "codex-rs/app-server/tests/suite/conversation_summary.rs", - "codex-rs/app-server/tests/suite/fuzzy_file_search.rs", - "codex-rs/app-server/tests/suite/v2/account.rs", - "codex-rs/app-server/tests/suite/v2/app_list.rs", - "codex-rs/app-server/tests/suite/v2/attestation.rs", - "codex-rs/app-server/tests/suite/v2/client_metadata.rs", - "codex-rs/app-server/tests/suite/v2/collaboration_mode_list.rs", - "codex-rs/app-server/tests/suite/v2/command_exec.rs", - "codex-rs/app-server/tests/suite/v2/compaction.rs" + "codex-rs/app-server/src/request_processors/thread_summary.rs", + "codex-rs/core/src/codex_thread.rs", + "codex-rs/core/src/config/mod.rs", + "codex-rs/core/src/exec.rs", + "codex-rs/core/src/exec_tests.rs", + "codex-rs/core/src/sandboxing/mod.rs", + "codex-rs/core/src/session/session.rs", + "codex-rs/core/src/session/turn_context.rs", + "codex-rs/core/src/spawn.rs", + "codex-rs/sandboxing/src/manager.rs" ], "source_state": "merged", - "subject_id": "25701", + "subject_id": "25700", "subject_kind": "pr", "surface_hints": [ "app_server_protocol", - "auth_accounts", - "cli_tui", "config_hooks", - "mcp_plugins", - "model_provider", - "release_packaging", "sandbox_permissions", "tests_ci" ], - "title": "fix: rename McpServer to TestAppServer", - "url": "https://github.com/openai/codex/pull/25701" + "title": "core: stop threading SandboxPolicy through exec", + "url": "https://github.com/openai/codex/pull/25700" }, { "attention_flags": [ + "auth_account", "breaking_change", "deprecated_removed", "new_feature", "protocol_change" ], - "changed_file_count": 1, + "changed_file_count": 4, "commit_shas": [ - "aadd9c999b4e0789f7afb2b9b8cc43000bb47e86" + "cc0c295e8d848ddfe2f3205dbce32bfc4f4c04b6", + "5327fc53dc007e3b35f092145d616f0339b18f94", + "3ad459228152dd5a64a6b68d7fbc485ede24d6a0" ], - "committed_at": "2026-06-01T22:14:03Z", + "committed_at": "2026-06-03T19:55:11Z", "next_step": "ai_review_required", - "pr_number": 25705, - "pr_url": "https://github.com/openai/codex/pull/25705", + "pr_number": 25469, + "pr_url": "https://github.com/openai/codex/pull/25469", "review_priority": "critical", - "review_reason": "Needs AI review for breaking_change, deprecated_removed, new_feature, protocol_change.", + "review_reason": "Needs AI review for auth_account, breaking_change, deprecated_removed, new_feature, protocol_change.", "sample_paths": [ - "codex-rs/app-server/tests/suite/v2/plugin_list.rs" + "codex-rs/app-server-protocol/src/protocol/v2/account.rs", + "codex-rs/backend-client/src/client.rs", + "codex-rs/backend-client/src/lib.rs", + "codex-rs/backend-client/src/types.rs" ], "source_state": "merged", - "subject_id": "25705", + "subject_id": "25469", "subject_kind": "pr", "surface_hints": [ "app_server_protocol", - "mcp_plugins", - "tests_ci" + "auth_accounts", + "cli_tui" ], - "title": "Fix stale TestAppServer rename in plugin_list test", - "url": "https://github.com/openai/codex/pull/25705" + "title": "[profile-switcher][rust] -- [1/2] Add app-server account session protocol", + "url": "https://github.com/openai/codex/pull/25469" }, { "attention_flags": [ - "deprecated_removed", - "new_feature", + "auth_account", + "breaking_change", "protocol_change", - "security_policy" + "release_packaging" ], - "changed_file_count": 18, + "changed_file_count": 2, "commit_shas": [ - "c68a3b56884ddec1ed904fd64b819d12f146f5bb", - "9f51e9ec7db4794b2e720091ce33bac385a79090" + "12f93af4dd3433b006ef6a2c5941af16e3417dc5" ], - "committed_at": "2026-06-01T22:24:41Z", + "committed_at": "2026-06-03T19:56:54Z", "next_step": "ai_review_required", - "pr_number": 25684, - "pr_url": "https://github.com/openai/codex/pull/25684", + "pr_number": 26075, + "pr_url": "https://github.com/openai/codex/pull/26075", "review_priority": "critical", - "review_reason": "Needs AI review for deprecated_removed, new_feature, protocol_change, security_policy.", + "review_reason": "Needs AI review for auth_account, breaking_change, protocol_change, release_packaging.", "sample_paths": [ - "codex-rs/core/src/tools/handlers/dynamic.rs", - "codex-rs/core/src/tools/handlers/extension_tools.rs", - "codex-rs/core/src/tools/handlers/mcp.rs", - "codex-rs/core/src/tools/handlers/multi_agents.rs", - "codex-rs/core/src/tools/handlers/multi_agents/close_agent.rs", - "codex-rs/core/src/tools/handlers/multi_agents/resume_agent.rs", - "codex-rs/core/src/tools/handlers/multi_agents/send_input.rs", - "codex-rs/core/src/tools/handlers/multi_agents/spawn.rs", - "codex-rs/core/src/tools/handlers/multi_agents/wait.rs", - "codex-rs/core/src/tools/handlers/tool_search.rs", - "codex-rs/core/src/tools/mod.rs", - "codex-rs/core/src/tools/registry.rs" + "codex-rs/app-server/src/request_processors/thread_processor.rs", + "codex-rs/app-server/tests/suite/v2/thread_fork.rs" ], "source_state": "merged", - "subject_id": "25684", + "subject_id": "26075", "subject_kind": "pr", "surface_hints": [ - "mcp_plugins", + "app_server_protocol", "tests_ci" ], - "title": "Move tool search metadata onto ToolExecutor", - "url": "https://github.com/openai/codex/pull/25684" + "title": "Fix forked thread name inheritance", + "url": "https://github.com/openai/codex/pull/26075" }, { "attention_flags": [ "breaking_change", + "deprecated_removed", "new_feature", - "protocol_change" + "protocol_change", + "release_packaging" ], - "changed_file_count": 3, + "changed_file_count": 6, "commit_shas": [ - "7c59422ee267f12cee565a6dd76931b4ad6c8d5c" + "c677bf1f9c6b263c185fd65a4fe8da2a1eb8fed1", + "a44923c056afdde77ad82f620825d95df392e0f1" ], - "committed_at": "2026-06-01T23:02:06Z", + "committed_at": "2026-06-03T22:24:40Z", "next_step": "ai_review_required", - "pr_number": 25661, - "pr_url": "https://github.com/openai/codex/pull/25661", + "pr_number": 26254, + "pr_url": "https://github.com/openai/codex/pull/26254", "review_priority": "critical", - "review_reason": "Needs AI review for breaking_change, new_feature, protocol_change.", + "review_reason": "Needs AI review for breaking_change, deprecated_removed, new_feature, protocol_change, release_packaging.", "sample_paths": [ - "codex-rs/app-server/tests/suite/v2/thread_fork.rs", - "codex-rs/rollout/src/compression.rs", - "codex-rs/thread-store/src/local/read_thread.rs" + "codex-rs/core/src/agent/control.rs", + "codex-rs/core/src/config/config_tests.rs", + "codex-rs/core/src/config/mod.rs", + "codex-rs/core/src/session/mod.rs", + "codex-rs/core/src/tools/handlers/agent_jobs.rs", + "codex-rs/core/tests/suite/model_runtime_selectors.rs" ], "source_state": "merged", - "subject_id": "25661", + "subject_id": "26254", "subject_kind": "pr", "surface_hints": [ - "app_server_protocol", + "config_hooks", + "model_provider", "tests_ci" ], - "title": "Reject directory rollout paths for pathless side chats", - "url": "https://github.com/openai/codex/pull/25661" + "title": "feat: catalog multi-agent v2 config", + "url": "https://github.com/openai/codex/pull/26254" }, { "attention_flags": [ "auth_account", - "breaking_change", "deprecated_removed", - "new_feature", "protocol_change", "release_packaging", "security_policy" ], - "changed_file_count": 14, + "changed_file_count": 5, "commit_shas": [ - "4334b19c23dfd421d45dfa91352777d2e075f400", - "cdefa6f448aac8a651d98c5b85c284d896242f30", - "af0113519af81d64846fec7b202759fbd8ed2c37", - "2c9ccbe03076dcbefa986049b734d117ab3a9fae", - "b4a1e10ce55584e53e8acce9fed01cc0e1a7d3f4", - "60c59733f2a2658ac5cecee6a1f5524b4e012132", - "a4101509c5036ea978f7999d2b25cab9b1fb43bc", - "9fa22ca31e61fe79b5fef6483a6fb80b93aeffdf", - "4dc6530cfab353e73c0275b8fa3dcc22d4d49065", - "13e783f35b4f790519d306f8b5473b6fa232c38b", - "672045c2f02af79b25821c0dd4471382d1aa6744", - "e910c8c78884e85b6b16e60e36e3a4e70bd668fa", - "595d035fbc9bf4ac4c380ff2148a7ef351805a67", - "e29a8a4de6972c917c0d5044549b5b6eba11877a", - "f935762b23b5ed8fe790b5ee05875c04bad7260a", - "4a86c1bbc5c51a9f7ca7b8c4b5f02d6f1a991582", - "bb82054dd019c138723ed9a6829380f6187ebd53", - "d31ba12f8286a5189d86911255c9fcd483325b8c", - "0a41113f270a7df86c2e00c4998343536d7f7cc8", - "8566da5226ffc36203500e92584a2ad98498a89a", - "d149f354b3de12bd2095f47ecc41f912cc515075", - "a385d1992c72f5834f34c033bf4bbfd87776ab50", - "055df79812c75ba36c30a9e6167eb88ffaca9673", - "978af3556fe91bada4dffecea29faefe541edb1b", - "927f6fa9e7412fc0cf0b24eeb90a3d44ede782ca", - "0674148fb7ed2d98f79bae1a0b209227f4f937a4", - "8d4fb216c409e2a51ee9c60880f28d4d9ef36b11", - "954d119567382a84b952c2506d0851fd24332916", - "8e2d32aa185a969a7db23e2ea864c7093d55c2c4", - "b3dd333fab07ce29283e9ffee63deeac127dd810", - "abb70eef1d7dc474659d3c99ef785e02840eff85", - "971cbc3d86c3176b265ba24a051fe3a4aa5a033d", - "0cd665434c03aea2528664d88c645dc99c0ce602", - "987c62e089a4f513c5f4650343ca3d663b1a173f", - "6c939f9b0c4579f895b07fff311cc7f27c926b2a", - "e7231c16d3bdc795bc58ebcd43b5f84e9455fcfe", - "7a21873b67988a54c9fd159b9585229e0440481a", - "b2ba6db5f2b83b368e8c33fdb48e78b308470172", - "4978f1b9f2fcc1b4b5de1d32fe2c8e594ff00437", - "efec451c18d5e980c1c27b6d53117311889b81f7", - "f3f550f71d57f93bd0be274e462e701c69a401e3", - "c23ee4a337451a5b2e2d67cc02f6d5844380ccda" - ], - "committed_at": "2026-06-01T23:23:59Z", + "21cce60ea30d5a467b4d205832151eecea1bdec0", + "8e9201e33d9d2977bffd36b71bf735fd0c01d850", + "b0bcb91619d8ce7501210bb0b101ee6745a2bfef", + "6109a503c8dd65781e5629c07ded8e1766872b44", + "4b635d1bfb20e827508a47fdccc256b38b3192c1", + "59eeb54a267e2e3ce7388fc583be2a30428dd0fc", + "dded19b69af14cf561b7df8549fe1e5f80e37709", + "b11ba666c8d67be9ee5d4184f2ba438a7da0b6b1", + "87f8676ad982b2a7d68142b86ef5b9f6c0f6d6ca" + ], + "committed_at": "2026-06-03T22:33:34Z", "next_step": "ai_review_required", - "pr_number": 22668, - "pr_url": "https://github.com/openai/codex/pull/22668", + "pr_number": 26074, + "pr_url": "https://github.com/openai/codex/pull/26074", "review_priority": "critical", - "review_reason": "Needs AI review for auth_account, breaking_change, deprecated_removed, new_feature, protocol_change, release_packaging, security_policy.", + "review_reason": "Needs AI review for auth_account, deprecated_removed, protocol_change, release_packaging, security_policy.", "sample_paths": [ - "codex-rs/Cargo.lock", - "codex-rs/cli/src/debug_sandbox.rs", - "codex-rs/core/src/tasks/user_shell.rs", - "codex-rs/core/src/tools/runtimes/mod.rs", - "codex-rs/core/src/tools/runtimes/mod_tests.rs", - "codex-rs/network-proxy/Cargo.toml", - "codex-rs/network-proxy/README.md", - "codex-rs/network-proxy/src/certs.rs", - "codex-rs/network-proxy/src/lib.rs", - "codex-rs/network-proxy/src/proxy.rs", - "codex-rs/network-proxy/src/upstream.rs", - "codex-rs/sandboxing/src/lib.rs" + "codex-rs/core/tests/suite/windows_sandbox.rs", + "codex-rs/windows-sandbox-rs/src/bin/setup_main/win.rs", + "codex-rs/windows-sandbox-rs/src/bin/setup_main/win/sandbox_users.rs", + "codex-rs/windows-sandbox-rs/src/setup.rs", + "codex-rs/windows-sandbox-rs/src/setup_error.rs" ], "source_state": "merged", - "subject_id": "22668", + "subject_id": "26074", "subject_kind": "pr", "surface_hints": [ - "cli_tui", - "config_hooks", - "docs_examples", "sandbox_permissions", "tests_ci" ], - "title": "Wire managed MITM CA trust into child env", - "url": "https://github.com/openai/codex/pull/22668" + "title": "Use Windows setup marker as completion signal", + "url": "https://github.com/openai/codex/pull/26074" }, { "attention_flags": [ "auth_account", "deprecated_removed", - "new_feature", - "protocol_change", - "security_policy" + "new_feature" ], - "changed_file_count": 47, + "changed_file_count": 7, "commit_shas": [ - "d378d0d13b7038783171e4e8045f211e75190f5c" + "834c12c90b0eef6da6bdb8b58f95f20550d93682", + "7ed3a82241e3d8439f9d39a5252bb5ab9f9e13e7", + "86bfacf0c44c1d2764772077703dadc7c9dabc79", + "e754d6e82c5d6fc7d6c2b330332327f9f97290da", + "bc6f8fb445856cba6e0a63502346234365706778" ], - "committed_at": "2026-06-01T23:33:42Z", + "committed_at": "2026-06-03T23:28:31Z", "next_step": "ai_review_required", - "pr_number": 25712, - "pr_url": "https://github.com/openai/codex/pull/25712", + "pr_number": 25623, + "pr_url": "https://github.com/openai/codex/pull/25623", "review_priority": "critical", - "review_reason": "Needs AI review for auth_account, deprecated_removed, new_feature, protocol_change, security_policy.", + "review_reason": "Needs AI review for auth_account, deprecated_removed, new_feature.", "sample_paths": [ - "codex-rs/Cargo.lock", - "codex-rs/app-server-protocol/src/protocol/v2/thread.rs", - "codex-rs/app-server/src/request_processors.rs", - "codex-rs/app-server/src/request_processors/external_agent_config_processor.rs", - "codex-rs/app-server/src/request_processors/thread_processor.rs", - "codex-rs/app-server/src/request_processors/thread_processor_tests.rs", - "codex-rs/app-server/src/request_processors/turn_processor.rs", - "codex-rs/app-server/tests/suite/conversation_summary.rs", - "codex-rs/app-server/tests/suite/v2/skills_list.rs", - "codex-rs/app-server/tests/suite/v2/thread_read.rs", - "codex-rs/app-server/tests/suite/v2/thread_shell_command.rs", - "codex-rs/app-server/tests/suite/v2/thread_start.rs" + "codex-rs/tui/src/chatwidget/tests/popups_and_settings.rs", + "codex-rs/tui/src/keymap.rs", + "codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_all_tab_search.snap", + "codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_custom.snap", + "codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_first_actions.snap", + "codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_narrow.snap", + "codex-rs/tui/src/snapshots/codex_tui__keymap_setup__tests__keymap_picker_wide.snap" ], "source_state": "merged", - "subject_id": "25712", + "subject_id": "25623", "subject_kind": "pr", "surface_hints": [ - "app_server_protocol", "cli_tui", "config_hooks", - "sandbox_permissions", "tests_ci" ], - "title": "app-server: remove experimental persist_extended_history bool flag", - "url": "https://github.com/openai/codex/pull/25712" + "title": "fix(tui): add reasoning effort fallback shortcuts", + "url": "https://github.com/openai/codex/pull/25623" }, { "attention_flags": [ "auth_account", "breaking_change", + "deprecated_removed", "new_feature", "protocol_change", - "release_packaging" + "release_packaging", + "security_policy" ], - "changed_file_count": 14, + "changed_file_count": 11, "commit_shas": [ - "486805b7cea244022b0856675acd1cb34c7e6488" + "17696479b8326d41d78cde9d1e9bb00fea4660e0" ], - "committed_at": "2026-06-01T23:43:52Z", + "committed_at": "2026-06-04T02:08:19Z", "next_step": "ai_review_required", - "pr_number": 24621, - "pr_url": "https://github.com/openai/codex/pull/24621", + "pr_number": 26189, + "pr_url": "https://github.com/openai/codex/pull/26189", "review_priority": "critical", - "review_reason": "Needs AI review for auth_account, breaking_change, new_feature, protocol_change, release_packaging.", + "review_reason": "Needs AI review for auth_account, breaking_change, deprecated_removed, new_feature, protocol_change, release_packaging, security_policy.", "sample_paths": [ + "codex-cli/bin/codex.js", "codex-rs/Cargo.lock", - "codex-rs/Cargo.toml", - "codex-rs/app-server/Cargo.toml", - "codex-rs/app-server/src/config_manager.rs", - "codex-rs/cloud-config/BUILD.bazel", - "codex-rs/cloud-config/Cargo.toml", - "codex-rs/cloud-config/src/lib.rs", - "codex-rs/cloud-requirements/BUILD.bazel", - "codex-rs/exec/Cargo.toml", - "codex-rs/exec/src/lib.rs", - "codex-rs/tui/Cargo.toml", - "codex-rs/tui/src/lib.rs" + "codex-rs/arg0/Cargo.toml", + "codex-rs/arg0/src/lib.rs", + "codex-rs/core/src/tasks/user_shell.rs", + "codex-rs/core/src/tasks/user_shell_tests.rs", + "codex-rs/core/src/tools/runtimes/mod.rs", + "codex-rs/core/src/tools/runtimes/mod_tests.rs", + "codex-rs/core/src/tools/runtimes/shell.rs", + "codex-rs/core/src/tools/runtimes/unified_exec.rs", + "codex-rs/install-context/src/lib.rs" ], "source_state": "merged", - "subject_id": "24621", + "subject_id": "26189", "subject_kind": "pr", "surface_hints": [ - "app_server_protocol", - "auth_accounts", "cli_tui", - "config_hooks" + "config_hooks", + "release_packaging", + "tests_ci" ], - "title": "Move cloud requirements crate to cloud config", - "url": "https://github.com/openai/codex/pull/24621" + "title": "cli: add package path from install context", + "url": "https://github.com/openai/codex/pull/26189" }, { "attention_flags": [ - "auth_account", - "breaking_change", - "deprecated_removed", "new_feature", - "protocol_change", "security_policy" ], - "changed_file_count": 15, + "changed_file_count": 2, "commit_shas": [ - "72523ec6dd98aadaf78c7cfab4059f3fea2720b9", - "c4ffb299f91e8f7f41ff22042cdc5bca8806d82c", - "f0ec5554dab6828490402239300577cbee331f22" + "6ea2525d52dc917da3c40cd8a4903a1e1c936976" ], - "committed_at": "2026-06-02T01:05:50Z", + "committed_at": "2026-06-02T23:26:36Z", "next_step": "ai_review_required", - "pr_number": 25675, - "pr_url": "https://github.com/openai/codex/pull/25675", - "review_priority": "critical", - "review_reason": "Needs AI review for auth_account, breaking_change, deprecated_removed, new_feature, protocol_change, security_policy.", + "pr_number": 25926, + "pr_url": "https://github.com/openai/codex/pull/25926", + "review_priority": "high", + "review_reason": "Needs AI review for new_feature, security_policy.", "sample_paths": [ - "codex-rs/app-server-protocol/src/export.rs", - "codex-rs/app-server-protocol/src/protocol/common.rs", - "codex-rs/app-server-protocol/src/protocol/v2/remote_control.rs", - "codex-rs/app-server-transport/src/transport/remote_control/enroll.rs", - "codex-rs/app-server-transport/src/transport/remote_control/mod.rs", - "codex-rs/app-server-transport/src/transport/remote_control/protocol.rs", - "codex-rs/app-server-transport/src/transport/remote_control/tests.rs", - "codex-rs/app-server-transport/src/transport/remote_control/tests/pairing_tests.rs", - "codex-rs/app-server-transport/src/transport/remote_control/websocket.rs", - "codex-rs/app-server/README.md", - "codex-rs/app-server/src/message_processor.rs", - "codex-rs/app-server/src/request_processors/remote_control_processor.rs" + "codex-rs/config/src/config_toml.rs", + "codex-rs/core/src/config/config_tests.rs" ], "source_state": "merged", - "subject_id": "25675", + "subject_id": "25926", "subject_kind": "pr", "surface_hints": [ - "app_server_protocol", - "docs_examples", + "config_hooks", "tests_ci" ], - "title": "feat(remote-control): add pairing start", - "url": "https://github.com/openai/codex/pull/25675" + "title": "config: express implicit sandbox defaults as permission profiles", + "url": "https://github.com/openai/codex/pull/25926" }, { "attention_flags": [ "auth_account", - "breaking_change", - "deprecated_removed", "new_feature", - "protocol_change", - "rate_limit", - "release_packaging", - "security_policy" + "protocol_change" ], - "changed_file_count": 40, + "changed_file_count": 2, "commit_shas": [ - "bc1f488d5461732a44051fff56efaa56edb7e877", - "f53903bb5e04adbfded417f0a0cf0293708d3c8f", - "466116d0728995e82dcc8a83c0f3a670a8c8f2bd", - "bdffb85ac200be271acc40f082a2eb98d4361368", - "9a8770e5a0295749c7b9a536515689d77fa26505", - "0c6a43a47241929e67bf345282694fc32cea68db", - "407eebdb363820c2847fc45a3f4d1f4ad97c03eb", - "fed088aa1e7bc263335bb8ab271c1e2bb9c17860", - "5629e1ac43419e725f78ecf85eadef2295196d2f", - "7e829bee95e216800b86ca95ed5e96d273b2830e", - "39091ecd6e2bb6adb7716a637d448713bce22dd2", - "1f612ac9aff3852bc993576995fb812de08d6d1a", - "144a7b432cd89629e542b0433a3d288b7b7a35fe", - "d8446b6922f749a59bc6737b03d2a155674aa918", - "8001158298e019173184ee9a95c2ab1757a9035e", - "fa8a8996ad87171fa461e80baef304b84489180f", - "eaa479ae9fff86f99bd4a990493e9b1f0e7edf87", - "157d1beceb6a6395f9f3f7490f99765901a4dada", - "8addd8104ecac6a6e0e1d8cbfe05f400ec1c2f91", - "e790a2038c6e9159ecc6454951eed4dfaf0e6a71", - "9c2d1ae16b8d4767c9c4cd6cd55ce626300fe4ab" - ], - "committed_at": "2026-06-02T04:25:42Z", + "d5516c0002b51ec4bd1cf09c856cf02eb5d143da" + ], + "committed_at": "2026-06-02T23:41:48Z", "next_step": "ai_review_required", - "pr_number": 24812, - "pr_url": "https://github.com/openai/codex/pull/24812", - "review_priority": "critical", - "review_reason": "Needs AI review for auth_account, breaking_change, deprecated_removed, new_feature, protocol_change, rate_limit, release_packaging, security_policy.", + "pr_number": 25963, + "pr_url": "https://github.com/openai/codex/pull/25963", + "review_priority": "high", + "review_reason": "Needs AI review for auth_account, new_feature, protocol_change.", "sample_paths": [ - "codex-rs/app-server-protocol/schema/json/ServerNotification.json", - "codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.schemas.json", - "codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.v2.schemas.json", - "codex-rs/app-server-protocol/schema/json/v2/AccountRateLimitsUpdatedNotification.json", - "codex-rs/app-server-protocol/schema/json/v2/GetAccountRateLimitsResponse.json", - "codex-rs/app-server-protocol/schema/typescript/v2/AccountRateLimitsUpdatedNotification.ts", - "codex-rs/app-server-protocol/schema/typescript/v2/RateLimitSnapshot.ts", - "codex-rs/app-server-protocol/schema/typescript/v2/SpendControlLimitSnapshot.ts", - "codex-rs/app-server-protocol/schema/typescript/v2/index.ts", - "codex-rs/app-server-protocol/src/protocol/v2/account.rs", - "codex-rs/app-server/README.md", - "codex-rs/app-server/src/bespoke_event_handling.rs" + "codex-rs/cloud-config/src/service.rs", + "codex-rs/cloud-config/src/service_tests.rs" ], "source_state": "merged", - "subject_id": "24812", + "subject_id": "25963", "subject_kind": "pr", "surface_hints": [ - "app_server_protocol", - "auth_accounts", - "cli_tui", - "docs_examples", - "model_provider", + "config_hooks", "tests_ci" ], - "title": "feat: show enterprise monthly credit limits in status", - "url": "https://github.com/openai/codex/pull/24812" + "title": "Allow EDU accounts to fetch cloud config bundles", + "url": "https://github.com/openai/codex/pull/25963" }, { "attention_flags": [ - "auth_account", - "deprecated_removed", "new_feature", - "protocol_change", - "release_packaging", - "security_policy" + "protocol_change" ], - "changed_file_count": 13, + "changed_file_count": 7, "commit_shas": [ - "ee5025e36c91294182849bbdc3e043f30d56db53", - "a1889a2dd566f8adc26892be5b32abe13b9249d2", - "2d9f1ba32017024684076b2ae6d20974df1f122f" + "31c2256f2a80c8923c7b21a0d670b5c0dd2fdb9e", + "e25edffa4abaeb32bf4ea2a428626db66a71c07d", + "aee17751f4348e01c693cdf14b87f38a26df2b11" ], - "committed_at": "2026-06-02T05:10:52Z", + "committed_at": "2026-06-03T10:22:23Z", "next_step": "ai_review_required", - "pr_number": 25457, - "pr_url": "https://github.com/openai/codex/pull/25457", - "review_priority": "critical", - "review_reason": "Needs AI review for auth_account, deprecated_removed, new_feature, protocol_change, release_packaging, security_policy.", + "pr_number": 26114, + "pr_url": "https://github.com/openai/codex/pull/26114", + "review_priority": "high", + "review_reason": "Needs AI review for new_feature, protocol_change.", "sample_paths": [ - "codex-rs/app-server/src/request_processors/plugins.rs", - "codex-rs/app-server/tests/suite/v2/plugin_list.rs", - "codex-rs/core-plugins/src/lib.rs", - "codex-rs/core-plugins/src/manager.rs", - "codex-rs/core-plugins/src/remote.rs", - "codex-rs/core-plugins/src/remote/catalog_cache.rs", - "codex-rs/core/src/connectors.rs", - "codex-rs/core/src/connectors_tests.rs", - "codex-rs/core/src/plugins/discoverable.rs", - "codex-rs/core/src/plugins/discoverable_tests.rs", - "codex-rs/core/src/session/turn.rs", - "codex-rs/core/src/tools/handlers/request_plugin_install.rs" + "codex-rs/core/src/config/config_tests.rs", + "codex-rs/core/src/config/mod.rs", + "codex-rs/core/src/tools/handlers/multi_agents_spec.rs", + "codex-rs/core/src/tools/handlers/multi_agents_spec_tests.rs", + "codex-rs/core/src/tools/handlers/multi_agents_tests.rs", + "codex-rs/core/tests/suite/spawn_agent_description.rs", + "codex-rs/core/tests/suite/subagent_notifications.rs" ], "source_state": "merged", - "subject_id": "25457", + "subject_id": "26114", "subject_kind": "pr", "surface_hints": [ - "app_server_protocol", - "mcp_plugins", - "release_packaging", + "config_hooks", "tests_ci" ], - "title": "[codex] Cache remote plugin catalog for suggestions", - "url": "https://github.com/openai/codex/pull/25457" + "title": "feat: default hide_spawn_agent_metadata to true", + "url": "https://github.com/openai/codex/pull/26114" }, { "attention_flags": [ @@ -726,807 +626,842 @@ "release_packaging", "security_policy" ], - "changed_file_count": 17, + "changed_file_count": 15, "commit_shas": [ - "8cd8071cd48f6a7e701f56a72685c208a98cfbaa", - "b679d1c4953e3476675c525be02f31ed47c353e9", - "823f674f43c5f2675afe3b2b76c3de8581954fe1", - "046f6a8a710ec07ed7164afd3d42bbf8f655a100" + "e5a46ba2ca5c9a40fe88b544ed5a5a6e2915217d", + "8a2de779011aae6f78df978cecd3465e59780ff8", + "b10e4894bb7177cf7e771ac1f414ab1a962d47c9" ], - "committed_at": "2026-06-01T18:50:23Z", + "committed_at": "2026-06-03T10:25:21Z", "next_step": "ai_review_required", - "pr_number": 25165, - "pr_url": "https://github.com/openai/codex/pull/25165", + "pr_number": 26122, + "pr_url": "https://github.com/openai/codex/pull/26122", "review_priority": "high", "review_reason": "Needs AI review for auth_account, new_feature, protocol_change, release_packaging, security_policy.", "sample_paths": [ - ".github/workflows/ci.yml", - "AGENTS.md", - "justfile", - "scripts/check_blob_size.py", - "scripts/codex_package/archive.py", - "scripts/codex_package/cargo.py", - "scripts/codex_package/cli.py", - "scripts/codex_package/layout.py", - "scripts/codex_package/test_cargo.py", - "scripts/codex_package/v8.py", - "scripts/just-shell.py", - "scripts/mock_responses_websocket_server.py" + "codex-rs/Cargo.lock", + "codex-rs/Cargo.toml", + "codex-rs/context-fragments/BUILD.bazel", + "codex-rs/context-fragments/Cargo.toml", + "codex-rs/context-fragments/src/additional_context.rs", + "codex-rs/context-fragments/src/fragment.rs", + "codex-rs/context-fragments/src/lib.rs", + "codex-rs/core-skills/Cargo.toml", + "codex-rs/core-skills/src/lib.rs", + "codex-rs/core-skills/src/skill_instructions.rs", + "codex-rs/core/Cargo.toml", + "codex-rs/core/src/context/mod.rs" ], "source_state": "merged", - "subject_id": "25165", + "subject_id": "26122", "subject_kind": "pr", "surface_hints": [ - "cli_tui", "config_hooks", - "docs_examples", - "release_packaging", - "tests_ci" + "sandbox_permissions" ], - "title": "Check root Python script formatting in CI", - "url": "https://github.com/openai/codex/pull/25165" + "title": "chore: extract context fragments into dedicated crate", + "url": "https://github.com/openai/codex/pull/26122" }, { "attention_flags": [ "auth_account", - "new_feature", - "protocol_change", - "security_policy" + "new_feature" ], - "changed_file_count": 16, + "changed_file_count": 5, "commit_shas": [ - "d5bd752c9a679c28cf7b8c21eba9ed4e66aaa15c", - "58f0201cf890001207627bc4197d8d070cf91236", - "3064b4ebf3e6aa4863c57d8129f1e4b09e20d9ad", - "028e32d35e51073efcc5cf328b0fb328c9e6f626", - "6948662d49c8ec1c7d7f9db6e227d458eeb3aa4f", - "cf128473a849b8bd4b6b5900c50e100d8896aecc", - "2b4d27d0b68c1392a02a2d7ee844a5cfed87989b", - "27b37fdfa1434572199c0905f9c0f45a30bd758b", - "0f42f7f9880007bdf48913e6d66e069598646ef2" - ], - "committed_at": "2026-06-01T18:51:15Z", + "ca96f9287f3791410b35f7504e5e83cb13706d5d", + "6c315c50a701b1ffcb21d94c3e5951584dd222bf" + ], + "committed_at": "2026-06-03T13:10:16Z", "next_step": "ai_review_required", - "pr_number": 23767, - "pr_url": "https://github.com/openai/codex/pull/23767", + "pr_number": 26155, + "pr_url": "https://github.com/openai/codex/pull/26155", "review_priority": "high", - "review_reason": "Needs AI review for auth_account, new_feature, protocol_change, security_policy.", + "review_reason": "Needs AI review for auth_account, new_feature.", "sample_paths": [ - "codex-rs/app-server/tests/common/models_cache.rs", - "codex-rs/codex-api/tests/models_integration.rs", - "codex-rs/core/src/guardian/review.rs", - "codex-rs/core/src/guardian/tests.rs", - "codex-rs/core/tests/suite/auto_review.rs", - "codex-rs/core/tests/suite/mod.rs", - "codex-rs/core/tests/suite/model_switching.rs", - "codex-rs/core/tests/suite/models_cache_ttl.rs", - "codex-rs/core/tests/suite/personality.rs", - "codex-rs/core/tests/suite/remote_models.rs", - "codex-rs/core/tests/suite/rmcp_client.rs", - "codex-rs/core/tests/suite/spawn_agent_description.rs" + "codex-rs/ext/goal/Cargo.toml", + "codex-rs/ext/goal/src/accounting.rs", + "codex-rs/ext/goal/src/runtime.rs", + "codex-rs/ext/goal/src/tool.rs", + "codex-rs/ext/goal/tests/goal_extension_backend.rs" ], "source_state": "merged", - "subject_id": "23767", + "subject_id": "26155", "subject_kind": "pr", "surface_hints": [ - "app_server_protocol", - "cli_tui", + "auth_accounts", "config_hooks", - "mcp_plugins", - "model_provider", "tests_ci" ], - "title": "[codex-rs] auto-review model override ", - "url": "https://github.com/openai/codex/pull/23767" + "title": "fix: serialize goal progress accounting", + "url": "https://github.com/openai/codex/pull/26155" }, { "attention_flags": [ + "auth_account", + "new_feature", "protocol_change", - "security_policy" + "release_packaging" ], - "changed_file_count": 1, + "changed_file_count": 15, "commit_shas": [ - "15200a375689d41197f4e7b5a7179900203aedf3", - "a0ee76a24d4d78ed35f43fc1fe3ec290a0c0465b" + "0bfd5ff05674c4159aaa67bbced4ec5809cfb9f3", + "c8f7d8ddff09e1e66e40a453ad295b5924dd4071", + "d7823b6433d15cca04c864f695c70e3e9ecfb456" ], - "committed_at": "2026-06-01T19:55:44Z", + "committed_at": "2026-06-03T14:24:16Z", "next_step": "ai_review_required", - "pr_number": 25669, - "pr_url": "https://github.com/openai/codex/pull/25669", + "pr_number": 26167, + "pr_url": "https://github.com/openai/codex/pull/26167", "review_priority": "high", - "review_reason": "Needs AI review for protocol_change, security_policy.", + "review_reason": "Needs AI review for auth_account, new_feature, protocol_change, release_packaging.", "sample_paths": [ - "codex-rs/app-server/tests/suite/v2/turn_start_zsh_fork.rs" + "codex-rs/Cargo.lock", + "codex-rs/ext/skills/Cargo.toml", + "codex-rs/ext/skills/src/catalog.rs", + "codex-rs/ext/skills/src/extension.rs", + "codex-rs/ext/skills/src/lib.rs", + "codex-rs/ext/skills/src/provider.rs", + "codex-rs/ext/skills/src/providers/executor.rs", + "codex-rs/ext/skills/src/providers/host.rs", + "codex-rs/ext/skills/src/providers/mod.rs", + "codex-rs/ext/skills/src/providers/remote.rs", + "codex-rs/ext/skills/src/render.rs", + "codex-rs/ext/skills/src/selection.rs" ], "source_state": "merged", - "subject_id": "25669", + "subject_id": "26167", "subject_kind": "pr", "surface_hints": [ - "app_server_protocol", + "config_hooks", + "model_provider", "tests_ci" ], - "title": "fix: deflake zsh-fork approval test", - "url": "https://github.com/openai/codex/pull/25669" + "title": "Implement v1 skills extension prompt injection", + "url": "https://github.com/openai/codex/pull/26167" }, { "attention_flags": [ - "auth_account", - "new_feature", - "protocol_change", - "release_packaging", - "security_policy" + "protocol_change" ], - "changed_file_count": 6, + "changed_file_count": 4, "commit_shas": [ - "cfbb27037b1bb488a0dd39272b149a160732503e" - ], - "committed_at": "2026-06-01T21:27:18Z", + "aec1eb1a13c9a27626c3af16845218895fa15759", + "63acf27a9ead33ddedf1103480e1bf11c8ba3d4b", + "2a07ae1a28ae463fd45de616adba1f83cc6a84b7", + "b54b7bf631331d1382bf3fad89a3bc4d02393c14", + "45561663a90b67fb20ba63361d59c93ef617c576", + "57872794aea8d75f91d9e8e4b01031ef349d609a" + ], + "committed_at": "2026-06-03T16:36:50Z", "next_step": "ai_review_required", - "pr_number": 25681, - "pr_url": "https://github.com/openai/codex/pull/25681", + "pr_number": 26047, + "pr_url": "https://github.com/openai/codex/pull/26047", "review_priority": "high", - "review_reason": "Needs AI review for auth_account, new_feature, protocol_change, release_packaging, security_policy.", + "review_reason": "Needs AI review for protocol_change.", "sample_paths": [ - "codex-rs/app-server/src/request_processors.rs", - "codex-rs/app-server/src/request_processors/plugins.rs", - "codex-rs/app-server/tests/suite/v2/plugin_list.rs", - "codex-rs/core-plugins/src/loader.rs", - "codex-rs/core-plugins/src/manager.rs", - "codex-rs/core-plugins/src/manager_tests.rs" + "codex-rs/tui/src/bottom_pane/custom_prompt_view.rs", + "codex-rs/tui/src/bottom_pane/custom_prompt_view_tests.rs", + "codex-rs/tui/src/bottom_pane/paste_burst.rs", + "codex-rs/tui/src/chatwidget/tests/popups_and_settings.rs" ], "source_state": "merged", - "subject_id": "25681", + "subject_id": "26047", "subject_kind": "pr", "surface_hints": [ - "app_server_protocol", - "mcp_plugins", + "cli_tui", + "config_hooks", "tests_ci" ], - "title": "fix: Deduplicate installed local and remote curated plugins", - "url": "https://github.com/openai/codex/pull/25681" + "title": "Fix multiline paste in /goal edit", + "url": "https://github.com/openai/codex/pull/26047" }, { "attention_flags": [ - "new_feature" + "release_packaging" ], "changed_file_count": 2, "commit_shas": [ - "47c41424db0b3ea53cd282e06455db41cf2e7f64" + "b6bfa4887288d4d5057517bf6b79928d1ef94d24", + "48b202ed6b7a44f167160bd77c42ce748a338a2e", + "c714fc0c545bdc2b42920b109b1f7d0b341ce2a8" ], - "committed_at": "2026-06-02T00:19:34Z", + "committed_at": "2026-06-03T18:29:36Z", "next_step": "ai_review_required", - "pr_number": 25717, - "pr_url": "https://github.com/openai/codex/pull/25717", + "pr_number": 25925, + "pr_url": "https://github.com/openai/codex/pull/25925", "review_priority": "high", - "review_reason": "Needs AI review for new_feature.", + "review_reason": "Needs AI review for release_packaging.", "sample_paths": [ - "codex-rs/core-plugins/src/manager_tests.rs", - "codex-rs/core-plugins/src/manifest.rs" + ".codex/environments/environment.toml", + ".codex/environments/setup.py" ], "source_state": "merged", - "subject_id": "25717", + "subject_id": "25925", "subject_kind": "pr", "surface_hints": [ - "mcp_plugins", - "tests_ci" + "config_hooks" ], - "title": "Handle invalid plugin skills manifest field", - "url": "https://github.com/openai/codex/pull/25717" + "title": "[codex] Copy user Bazel settings into Codex worktrees", + "url": "https://github.com/openai/codex/pull/25925" }, { "attention_flags": [ "auth_account", "new_feature", - "protocol_change" + "protocol_change", + "release_packaging" ], - "changed_file_count": 2, + "changed_file_count": 5, "commit_shas": [ - "64f3943195c8a34c38d95296e977dfff4c046aef" + "f56746d37a501af1f190fb595c4ef197bb6973e9", + "3bf335cde3193e49b631650a850912515f6ad6c2", + "8e7eb806ca91c02fc58b1ae928b80aebde19caa5", + "e49b671bbd075ae31eb2c098833a5fa454d02c76" ], - "committed_at": "2026-06-02T04:27:06Z", + "committed_at": "2026-06-03T19:14:14Z", "next_step": "ai_review_required", - "pr_number": 25330, - "pr_url": "https://github.com/openai/codex/pull/25330", + "pr_number": 26216, + "pr_url": "https://github.com/openai/codex/pull/26216", "review_priority": "high", - "review_reason": "Needs AI review for auth_account, new_feature, protocol_change.", + "review_reason": "Needs AI review for auth_account, new_feature, protocol_change, release_packaging.", "sample_paths": [ - "codex-rs/cli/src/plugin_cmd.rs", - "codex-rs/cli/tests/plugin_cli.rs" + "sdk/python/pyproject.toml", + "sdk/python/src/openai_codex/generated/v2_all.py", + "sdk/python/tests/test_artifact_workflow_and_binaries.py", + "sdk/python/tests/test_contract_generation.py", + "sdk/python/uv.lock" ], "source_state": "merged", - "subject_id": "25330", + "subject_id": "26216", "subject_kind": "pr", "surface_hints": [ - "cli_tui", - "mcp_plugins", + "config_hooks", "tests_ci" ], - "title": "[codex] Add plugin list JSON output", - "url": "https://github.com/openai/codex/pull/25330" + "title": "[codex] Pin Python SDK to runtime 0.137.0a4", + "url": "https://github.com/openai/codex/pull/26216" }, { "attention_flags": [ - "auth_account", "new_feature", "protocol_change", - "security_policy" + "release_packaging" ], "changed_file_count": 3, "commit_shas": [ - "0f832b68676103eedee4e9eb4c66e6683ac3cde3" + "5c5420a311fc2d3154870acac2d40ad5a5aa66e2" ], - "committed_at": "2026-06-02T06:25:37Z", + "committed_at": "2026-06-03T19:39:13Z", "next_step": "ai_review_required", - "pr_number": 25783, - "pr_url": "https://github.com/openai/codex/pull/25783", + "pr_number": 25887, + "pr_url": "https://github.com/openai/codex/pull/25887", "review_priority": "high", - "review_reason": "Needs AI review for auth_account, new_feature, protocol_change, security_policy.", + "review_reason": "Needs AI review for new_feature, protocol_change, release_packaging.", "sample_paths": [ - "codex-rs/core-plugins/src/discoverable.rs", - "codex-rs/core-plugins/src/lib.rs", - "codex-rs/core/src/plugins/discoverable.rs" + "codex-rs/app-server/tests/suite/v2/plugin_list.rs", + "codex-rs/app-server/tests/suite/v2/plugin_read.rs", + "codex-rs/core-plugins/src/remote.rs" ], "source_state": "merged", - "subject_id": "25783", + "subject_id": "25887", "subject_kind": "pr", "surface_hints": [ - "mcp_plugins" + "app_server_protocol", + "mcp_plugins", + "tests_ci" ], - "title": "[codex] Move plugin discoverable logic into core-plugins", - "url": "https://github.com/openai/codex/pull/25783" + "title": "Preserve remote plugin default prompts", + "url": "https://github.com/openai/codex/pull/25887" }, { "attention_flags": [ - "release_packaging" + "protocol_change" ], - "changed_file_count": 1, + "changed_file_count": 4, "commit_shas": [ - "11411353ff8d626c5a6e572a63b8c763e8c6eccf" - ], - "committed_at": "2026-06-01T17:34:12Z", + "4bd82b8913ee4d58a753ec27a7f048085926d1ad", + "9ba487eef72f80f9dad9a6579911cdd18947cec9", + "71bc830f9b0873c51c59c1ff9499d2ac41f06932", + "9100c4aa1869bbafd2ebcf6408e9ac4d333b2e5b", + "64a8cb29d81b34599a728a9d4597d314e4d4f92c", + "cd92f422aa80096d70ef9058b4bff8981fc68506", + "6d77965f075bf2f760e82107bed88b86945e0e72" + ], + "committed_at": "2026-06-03T19:49:58Z", "next_step": "ai_review_required", - "pr_number": 25644, - "pr_url": "https://github.com/openai/codex/pull/25644", - "review_priority": "normal", - "review_reason": "Needs AI review for release_packaging.", + "pr_number": 25944, + "pr_url": "https://github.com/openai/codex/pull/25944", + "review_priority": "high", + "review_reason": "Needs AI review for protocol_change.", "sample_paths": [ - ".github/workflows/rust-release.yml" + "codex-rs/core/src/event_mapping_tests.rs", + "codex-rs/core/tests/suite/image_rollout.rs", + "codex-rs/protocol/src/models.rs", + "codex-rs/protocol/src/protocol.rs" ], "source_state": "merged", - "subject_id": "25644", + "subject_id": "25944", "subject_kind": "pr", "surface_hints": [ - "release_packaging", + "app_server_protocol", + "model_provider", "tests_ci" ], - "title": "[codex] Use git CLI for release Cargo fetches", - "url": "https://github.com/openai/codex/pull/25644" + "title": "Expose local image paths to models", + "url": "https://github.com/openai/codex/pull/25944" }, { "attention_flags": [ + "auth_account", "protocol_change" ], "changed_file_count": 1, "commit_shas": [ - "b5b23651158af48f0cbdddc2054ad2b75ad2a1ff" + "49a78e5d80fe2ead38ce4cfd9af809b817db9624" ], - "committed_at": "2026-06-01T17:48:29Z", + "committed_at": "2026-06-03T21:02:55Z", "next_step": "ai_review_required", - "pr_number": 25655, - "pr_url": "https://github.com/openai/codex/pull/25655", - "review_priority": "normal", - "review_reason": "Needs AI review for protocol_change.", + "pr_number": 25960, + "pr_url": "https://github.com/openai/codex/pull/25960", + "review_priority": "high", + "review_reason": "Needs AI review for auth_account, protocol_change.", "sample_paths": [ - "codex-rs/tools/src/tool_call.rs" + "codex-rs/app-server/tests/suite/v2/imagegen_extension.rs" ], "source_state": "merged", - "subject_id": "25655", + "subject_id": "25960", "subject_kind": "pr", "surface_hints": [ - "internal_churn" + "app_server_protocol", + "tests_ci" ], - "title": "nit: drop todo", - "url": "https://github.com/openai/codex/pull/25655" + "title": "Restore Windows coverage for code-mode image generation exposure", + "url": "https://github.com/openai/codex/pull/25960" }, { - "attention_flags": [ - "auth_account", - "new_feature" + "attention_flags": [], + "changed_file_count": 3, + "commit_shas": [ + "d4f0dcd05f6bffd798bd0dfc3cb520b58eb054fa" + ], + "committed_at": "2026-06-03T23:06:52Z", + "next_step": "ai_review_required", + "pr_number": 26002, + "pr_url": "https://github.com/openai/codex/pull/26002", + "review_priority": "high", + "review_reason": "Needs AI review for surface hints: cli_tui, mcp_plugins, tests_ci.", + "sample_paths": [ + "codex-rs/analytics/src/analytics_client_tests.rs", + "codex-rs/analytics/src/events.rs", + "codex-rs/core/tests/suite/plugins.rs" + ], + "source_state": "merged", + "subject_id": "26002", + "subject_kind": "pr", + "surface_hints": [ + "cli_tui", + "mcp_plugins", + "tests_ci" ], + "title": "log plugin MCP server names", + "url": "https://github.com/openai/codex/pull/26002" + }, + { + "attention_flags": [], "changed_file_count": 1, "commit_shas": [ - "c92fce4ca101f32e6c3f2b5bb58b4718b9f4b4fc" + "817a254262c6d8038ff78d68521daf7362779781" ], - "committed_at": "2026-06-01T17:54:52Z", + "committed_at": "2026-06-04T10:46:02Z", "next_step": "ai_review_required", - "pr_number": 25654, - "pr_url": "https://github.com/openai/codex/pull/25654", - "review_priority": "normal", - "review_reason": "Needs AI review for auth_account, new_feature.", + "pr_number": 26367, + "pr_url": "https://github.com/openai/codex/pull/26367", + "review_priority": "high", + "review_reason": "Needs AI review for surface hints: config_hooks.", "sample_paths": [ - "codex-rs/rollout/src/compression.rs" + "codex-rs/core/src/config/mod.rs" ], "source_state": "merged", - "subject_id": "25654", + "subject_id": "26367", "subject_kind": "pr", "surface_hints": [ - "internal_churn" + "config_hooks" ], - "title": "Parallelize cold rollout compression", - "url": "https://github.com/openai/codex/pull/25654" + "title": "chore: calm down", + "url": "https://github.com/openai/codex/pull/26367" }, { "attention_flags": [ "auth_account", + "breaking_change", + "deprecated_removed", "new_feature", "protocol_change", - "security_policy" + "release_packaging" ], - "changed_file_count": 2, + "changed_file_count": 13, "commit_shas": [ - "1ff530376e8284e18624f701ae9eb6b0fdf4d446", - "d3938c8624b2a9ff09e3725bde20a072ae08a31f", - "55ec07d903a016e3e9966998aef79a7e7d9e3341" + "c12a3d211685c9a7b016194801ac21bd3eb4c5f8", + "bc692a4202e0e5b4074cfe2fd57d897d696dc962", + "fa389b109318494813f8975a1c07b67212aceefe", + "0f35529aa73e46f64f828eb6160581e488b881b1" ], - "committed_at": "2026-06-01T17:55:52Z", + "committed_at": "2026-06-02T23:22:32Z", "next_step": "ai_review_required", - "pr_number": 25121, - "pr_url": "https://github.com/openai/codex/pull/25121", + "pr_number": 25915, + "pr_url": "https://github.com/openai/codex/pull/25915", "review_priority": "normal", - "review_reason": "Needs AI review for auth_account, new_feature, protocol_change, security_policy.", + "review_reason": "Needs AI review for auth_account, breaking_change, deprecated_removed, new_feature, protocol_change, release_packaging.", "sample_paths": [ - "codex-rs/exec-server/src/environment_path.rs", - "codex-rs/exec-server/src/lib.rs" + ".bazelrc", + ".github/scripts/run-bazel-ci.sh", + ".github/scripts/run-bazel-query-ci.sh", + ".github/scripts/run_bazel_with_buildbuddy.py", + ".github/scripts/rusty_v8_bazel.py", + ".github/scripts/test_run_bazel_with_buildbuddy.py", + ".github/scripts/test_rusty_v8_bazel.py", + ".github/workflows/bazel.yml", + ".github/workflows/rusty-v8-release.yml", + ".github/workflows/v8-canary.yml", + "codex-rs/docs/bazel.md", + "justfile" ], "source_state": "merged", - "subject_id": "25121", + "subject_id": "25915", "subject_kind": "pr", "surface_hints": [ - "internal_churn" + "cli_tui", + "docs_examples", + "release_packaging", + "tests_ci" ], - "title": "exec-server: add environment path refs", - "url": "https://github.com/openai/codex/pull/25121" + "title": "[codex] Fix Windows BuildBuddy Bazel wrapper execution", + "url": "https://github.com/openai/codex/pull/25915" }, { "attention_flags": [ "auth_account", + "deprecated_removed", "new_feature", "protocol_change" ], - "changed_file_count": 3, + "changed_file_count": 5, "commit_shas": [ - "8f4cc03faf8805dd43ad6ef6402b8e52c9d6515a", - "d5a70cf47789759cd5cab13b2b236803719b0210", - "5810eed0d772062b0daea7cc7c2d617308742ccd", - "24c41147ec2bd938a391792fab15e558a7de5121", - "101855ee0c3413596b80a185330c5f6eb761fde2", - "c28620aaf6c2b4a753dc05aa2916a838a8b8cac9", - "d6ce69481e89b718a5dd841838b99663c287fb06", - "65a021073cacb924048438c84e7dc9a248946091", - "957aca2ef2e62be3fc4bfa69ae3624096708d2d6", - "fce27d47544a07422fb57c5e48532d7a4cc8a853", - "1ed627cf1b8488d926817cf68e2b3d46833ef8e8", - "9c9e30529edbb5626b22ef32b4250be62455057c" - ], - "committed_at": "2026-06-01T18:26:36Z", + "2675bbaf208d3a9b7edad77d6275970f59c8dcc4", + "c552a5389d582c0bcdb72d2ab24726950a3e4a32", + "ec9d9b0b234789bd871c53f9e9921547c12a9bb0" + ], + "committed_at": "2026-06-02T23:33:31Z", "next_step": "ai_review_required", - "pr_number": 24983, - "pr_url": "https://github.com/openai/codex/pull/24983", + "pr_number": 25959, + "pr_url": "https://github.com/openai/codex/pull/25959", "review_priority": "normal", - "review_reason": "Needs AI review for auth_account, new_feature, protocol_change.", + "review_reason": "Needs AI review for auth_account, deprecated_removed, new_feature, protocol_change.", "sample_paths": [ - "justfile", - "scripts/just-shell.py", - "sdk/python/tests/test_artifact_workflow_and_binaries.py" + "codex-rs/core/src/session/turn.rs", + "codex-rs/ext/extension-api/src/contributors.rs", + "codex-rs/ext/extension-api/src/contributors/turn_input.rs", + "codex-rs/ext/extension-api/src/lib.rs", + "codex-rs/ext/extension-api/src/registry.rs" ], "source_state": "merged", - "subject_id": "24983", + "subject_id": "25959", "subject_kind": "pr", "surface_hints": [ - "tests_ci" + "internal_churn" ], - "title": "[codex] Make justfile recipes Windows-aware", - "url": "https://github.com/openai/codex/pull/24983" + "title": "feat: add extension turn-input contributors", + "url": "https://github.com/openai/codex/pull/25959" }, { "attention_flags": [ - "breaking_change", - "deprecated_removed", - "new_feature" + "release_packaging" ], - "changed_file_count": 2, + "changed_file_count": 3, "commit_shas": [ - "0147db5be86208ddbbd29d7382f5b4743d3d38a7", - "894590a07d27f592699d2216be0db876b954b347" + "84aa51a616f4a08a25aa7bd1da9d3c17e7e8d56d", + "3a2e0feed95183f3bb173bb27acb6abdf48977bb" ], - "committed_at": "2026-06-01T18:46:54Z", + "committed_at": "2026-06-03T00:34:04Z", "next_step": "ai_review_required", - "pr_number": 25659, - "pr_url": "https://github.com/openai/codex/pull/25659", + "pr_number": 25988, + "pr_url": "https://github.com/openai/codex/pull/25988", "review_priority": "normal", - "review_reason": "Needs AI review for breaking_change, deprecated_removed, new_feature.", + "review_reason": "Needs AI review for release_packaging.", "sample_paths": [ - "codex-rs/rollout/src/compression.rs", - "codex-rs/rollout/src/compression_tests.rs" + ".github/scripts/archive-release-symbols-and-strip-binaries.sh", + ".github/workflows/rust-release-windows.yml", + ".github/workflows/rust-release.yml" ], "source_state": "merged", - "subject_id": "25659", + "subject_id": "25988", "subject_kind": "pr", "surface_hints": [ + "release_packaging", "tests_ci" ], - "title": "Throttle repeated rollout compression runs", - "url": "https://github.com/openai/codex/pull/25659" + "title": "revert: publish release symbol artifacts", + "url": "https://github.com/openai/codex/pull/25988" }, { "attention_flags": [ - "auth_account", - "new_feature", - "protocol_change", - "security_policy" + "new_feature" ], - "changed_file_count": 10, + "changed_file_count": 2, "commit_shas": [ - "7f11af9129e556d821572039ef5cd15433e5a12e" + "7c24e6641b693a3eed933dd376ce8f424ab6ea5f" ], - "committed_at": "2026-06-01T20:22:28Z", + "committed_at": "2026-06-03T11:30:04Z", "next_step": "ai_review_required", - "pr_number": 24980, - "pr_url": "https://github.com/openai/codex/pull/24980", + "pr_number": 26144, + "pr_url": "https://github.com/openai/codex/pull/26144", "review_priority": "normal", - "review_reason": "Needs AI review for auth_account, new_feature, protocol_change, security_policy.", + "review_reason": "Needs AI review for new_feature.", "sample_paths": [ - "codex-rs/core/src/tools/handlers/shell_spec.rs", - "codex-rs/core/src/tools/handlers/shell_spec_tests.rs", - "codex-rs/core/src/tools/handlers/unified_exec.rs", - "codex-rs/core/src/tools/handlers/unified_exec/exec_command.rs", - "codex-rs/core/src/tools/handlers/unified_exec_tests.rs", - "codex-rs/core/src/tools/spec_plan.rs", - "codex-rs/core/src/tools/spec_plan_tests.rs", - "codex-rs/core/src/unified_exec/mod.rs", - "codex-rs/core/src/unified_exec/process_manager.rs", - "codex-rs/core/src/unified_exec/process_manager_tests.rs" + "codex-rs/core/src/tools/handlers/multi_agents_tests.rs", + "codex-rs/core/src/tools/handlers/multi_agents_v2/close_agent.rs" ], "source_state": "merged", - "subject_id": "24980", + "subject_id": "26144", "subject_kind": "pr", "surface_hints": [ "tests_ci" ], - "title": "refactor: hide shell override for zsh fork unified exec", - "url": "https://github.com/openai/codex/pull/24980" + "title": "Reject MAv2 close_agent self-targets", + "url": "https://github.com/openai/codex/pull/26144" }, { "attention_flags": [ + "breaking_change", "deprecated_removed", - "new_feature" + "protocol_change" ], "changed_file_count": 1, "commit_shas": [ - "46493839bb624898916a7d080b06743ff747248a" + "25848d1e46d31da745f377335ef5bf28ce75c80d" ], - "committed_at": "2026-06-01T20:26:32Z", + "committed_at": "2026-06-03T16:34:32Z", "next_step": "ai_review_required", - "pr_number": 25679, - "pr_url": "https://github.com/openai/codex/pull/25679", + "pr_number": 26179, + "pr_url": "https://github.com/openai/codex/pull/26179", "review_priority": "normal", - "review_reason": "Needs AI review for deprecated_removed, new_feature.", + "review_reason": "Needs AI review for breaking_change, deprecated_removed, protocol_change.", "sample_paths": [ - "codex-rs/rollout/src/compression.rs" + "codex-rs/core/src/tools/handlers/multi_agents_spec.rs" ], "source_state": "merged", - "subject_id": "25679", + "subject_id": "26179", "subject_kind": "pr", "surface_hints": [ "internal_churn" ], - "title": "Add rollout compression counters", - "url": "https://github.com/openai/codex/pull/25679" + "title": "nit: small prompt update for MAv2", + "url": "https://github.com/openai/codex/pull/26179" }, { "attention_flags": [ - "new_feature" + "new_feature", + "protocol_change" ], - "changed_file_count": 1, + "changed_file_count": 3, "commit_shas": [ - "4d08fcd4b5eb0996b4b61d55c9498bdab3fe38ef" + "18147be6a9fcb36d293ceb4537e6248d9221d12b", + "cbefa2a0332320e465db9fa8d82d21ab7eab8d9e" ], - "committed_at": "2026-06-01T20:36:16Z", + "committed_at": "2026-06-03T16:36:10Z", "next_step": "ai_review_required", - "pr_number": 25682, - "pr_url": "https://github.com/openai/codex/pull/25682", + "pr_number": 26175, + "pr_url": "https://github.com/openai/codex/pull/26175", "review_priority": "normal", - "review_reason": "Needs AI review for new_feature.", + "review_reason": "Needs AI review for new_feature, protocol_change.", "sample_paths": [ - "AGENTS.md" + "codex-rs/core/src/environment_selection.rs", + "codex-rs/core/src/session/review.rs", + "codex-rs/core/src/session/turn_context.rs" ], "source_state": "merged", - "subject_id": "25682", + "subject_id": "26175", "subject_kind": "pr", "surface_hints": [ "internal_churn" ], - "title": "[codex] document out-of-line test module convention", - "url": "https://github.com/openai/codex/pull/25682" + "title": "feat: guard git enrichment", + "url": "https://github.com/openai/codex/pull/26175" }, { "attention_flags": [ - "new_feature" + "auth_account", + "new_feature", + "protocol_change", + "release_packaging", + "security_policy" ], - "changed_file_count": 1, + "changed_file_count": 3, "commit_shas": [ - "46493839bb624898916a7d080b06743ff747248a", - "3846901efe60c2dd33ff2038a66f6863882fe60d", - "5e2196e4ad0fffd75b169fdc57aa4ee396c7559f" + "d138fddfbe3c2045007209353950265ccd4c5838", + "1d802cd293d6fe3cc765d8c63c315cd1c23b81cc", + "64c93173c29da0436eeae8d6b6120267d9f1c157", + "ded50c714096fa0936d1af4f56cc070758c692b9" ], - "committed_at": "2026-06-01T20:54:25Z", + "committed_at": "2026-06-03T21:29:52Z", "next_step": "ai_review_required", - "pr_number": 25680, - "pr_url": "https://github.com/openai/codex/pull/25680", + "pr_number": 26226, + "pr_url": "https://github.com/openai/codex/pull/26226", "review_priority": "normal", - "review_reason": "Needs AI review for new_feature.", + "review_reason": "Needs AI review for auth_account, new_feature, protocol_change, release_packaging, security_policy.", "sample_paths": [ - "codex-rs/rollout/src/compression.rs" + ".github/workflows/python-runtime-build.yml", + ".github/workflows/python-runtime-release.yml", + ".github/workflows/python-sdk-release.yml" ], "source_state": "merged", - "subject_id": "25680", + "subject_id": "26226", "subject_kind": "pr", "surface_hints": [ - "internal_churn" + "release_packaging", + "tests_ci" ], - "title": "Add rollout compression histograms", - "url": "https://github.com/openai/codex/pull/25680" + "title": "[codex] Split Python runtime release workflow", + "url": "https://github.com/openai/codex/pull/26226" }, { "attention_flags": [ + "auth_account", + "breaking_change", + "deprecated_removed", "new_feature", "protocol_change", "release_packaging" ], - "changed_file_count": 1, + "changed_file_count": 6, "commit_shas": [ - "aaf5504be01a65c574429427843745314de578b7" + "c116c0fccf551efdedb23fa1c59ec854033760bc", + "bb5157db25e31f835c2221e3e3a28c9e369c935c", + "e54b4fc75bf23c4721e70c09e2d6696c59697e8d", + "679339c60750b52e7eeaf6cebe3db722aa1e139f" ], - "committed_at": "2026-06-01T21:05:54Z", + "committed_at": "2026-06-03T22:25:50Z", "next_step": "ai_review_required", - "pr_number": 25690, - "pr_url": "https://github.com/openai/codex/pull/25690", + "pr_number": 26251, + "pr_url": "https://github.com/openai/codex/pull/26251", "review_priority": "normal", - "review_reason": "Needs AI review for new_feature, protocol_change, release_packaging.", + "review_reason": "Needs AI review for auth_account, breaking_change, deprecated_removed, new_feature, protocol_change, release_packaging.", "sample_paths": [ - "AGENTS.md" + "codex-rs/core/src/compact_remote.rs", + "codex-rs/core/src/compact_remote_v2.rs", + "codex-rs/core/src/context_manager/history.rs", + "codex-rs/core/src/context_manager/history_tests.rs", + "codex-rs/core/src/context_manager/mod.rs", + "codex-rs/core/tests/suite/compact_remote.rs" ], "source_state": "merged", - "subject_id": "25690", + "subject_id": "26251", "subject_kind": "pr", "surface_hints": [ - "internal_churn" + "tests_ci" ], - "title": "Add Python version compatibility guidance", - "url": "https://github.com/openai/codex/pull/25690" + "title": "Rewrite oversized tool outputs during remote compaction", + "url": "https://github.com/openai/codex/pull/26251" }, { "attention_flags": [ "new_feature", "protocol_change" ], - "changed_file_count": 2, + "changed_file_count": 1, "commit_shas": [ - "f6ba01688689db0d1ff203ff5ff3cfc3966f8e8b" + "8097c0a76788ff296131224508fa6c695bf098d9" ], - "committed_at": "2026-06-01T22:04:11Z", + "committed_at": "2026-06-03T22:29:57Z", "next_step": "ai_review_required", - "pr_number": 25702, - "pr_url": "https://github.com/openai/codex/pull/25702", + "pr_number": 26260, + "pr_url": "https://github.com/openai/codex/pull/26260", "review_priority": "normal", "review_reason": "Needs AI review for new_feature, protocol_change.", "sample_paths": [ - "codex-rs/ext/web-search/src/extension.rs", - "codex-rs/ext/web-search/src/tool.rs" + ".codex/skills/codex-pr-body/SKILL.md" ], "source_state": "merged", - "subject_id": "25702", + "subject_id": "26260", "subject_kind": "pr", "surface_hints": [ "internal_churn" ], - "title": "[codex] enable parallel standalone web search calls", - "url": "https://github.com/openai/codex/pull/25702" + "title": "codex-pr-body: avoid confidential references", + "url": "https://github.com/openai/codex/pull/26260" }, { "attention_flags": [ - "new_feature" + "deprecated_removed", + "new_feature", + "protocol_change" ], - "changed_file_count": 7, + "changed_file_count": 12, "commit_shas": [ - "d2b00249f3698b8f852afc7425e84169a378e576", - "52683c4f5ac03ea09781d04980540f18c1964f18" + "efddbb42e4dc678c2f5ab35f9eafe6a9b147f3cc", + "4e2e05341d8eac652cd10a7b09891cae1bac19d1" ], - "committed_at": "2026-06-01T22:41:22Z", + "committed_at": "2026-06-03T23:30:15Z", "next_step": "ai_review_required", - "pr_number": 25625, - "pr_url": "https://github.com/openai/codex/pull/25625", + "pr_number": 25638, + "pr_url": "https://github.com/openai/codex/pull/25638", "review_priority": "normal", - "review_reason": "Needs AI review for new_feature.", + "review_reason": "Needs AI review for deprecated_removed, new_feature, protocol_change.", "sample_paths": [ - "codex-rs/tui/src/bottom_pane/chat_composer.rs", - "codex-rs/tui/src/bottom_pane/footer.rs", - "codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_shortcut_overlay.snap", - "codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_shortcut_overlay_queue_submissions.snap", - "codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_shortcuts_collaboration_modes_enabled.snap", - "codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_shortcuts_running.snap", - "codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_shortcuts_shift_and_esc.snap" + "codex-rs/tui/src/app/event_dispatch.rs", + "codex-rs/tui/src/app/history_ui.rs", + "codex-rs/tui/src/app/history_ui_tests.rs", + "codex-rs/tui/src/app/snapshots/codex_tui__app__history_ui__tests__desktop_thread_open_error_history.snap", + "codex-rs/tui/src/app/snapshots/codex_tui__app__history_ui__tests__desktop_thread_opened_history.snap", + "codex-rs/tui/src/app_event.rs", + "codex-rs/tui/src/bottom_pane/command_popup.rs", + "codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__command_popup__tests__command_popup_app.snap", + "codex-rs/tui/src/chatwidget/slash_dispatch.rs", + "codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__slash_app_without_thread_id_shows_starting_error.snap", + "codex-rs/tui/src/chatwidget/tests/slash_commands.rs", + "codex-rs/tui/src/slash_command.rs" ], "source_state": "merged", - "subject_id": "25625", + "subject_id": "25638", "subject_kind": "pr", "surface_hints": [ "cli_tui", "tests_ci" ], - "title": "fix(tui): clarify footer shortcut overlay hints", - "url": "https://github.com/openai/codex/pull/25625" + "title": "feat(tui): add /app desktop handoff", + "url": "https://github.com/openai/codex/pull/25638" }, { "attention_flags": [ "auth_account", "new_feature", - "release_packaging" + "protocol_change" ], "changed_file_count": 3, "commit_shas": [ - "ef21fca892ca544cbd4e7a50a043f57ac728df3b", - "1d25eca8c5959c52919688051304579725cc49f6", - "d8a0db636391a82a9b60f5d44ed20334e0102d80", - "f2c0eeefea3b5486a422c621817e52f59c77c577", - "b017bc0c0971224d6c31f0cf7478368e9a3ce8a7", - "4d5173b8fea0a4dc4d26b2e697451657094a682c" - ], - "committed_at": "2026-06-01T22:49:54Z", + "58979a2400676afdc57eea31942ddf2ac85bc333" + ], + "committed_at": "2026-06-04T03:00:44Z", "next_step": "ai_review_required", - "pr_number": 25649, - "pr_url": "https://github.com/openai/codex/pull/25649", + "pr_number": 25946, + "pr_url": "https://github.com/openai/codex/pull/25946", "review_priority": "normal", - "review_reason": "Needs AI review for auth_account, new_feature, release_packaging.", + "review_reason": "Needs AI review for auth_account, new_feature, protocol_change.", "sample_paths": [ - ".github/scripts/archive-release-symbols-and-strip-binaries.sh", - ".github/workflows/rust-release-windows.yml", - ".github/workflows/rust-release.yml" + "codex-rs/core/src/compact.rs", + "codex-rs/core/src/compact_remote.rs", + "codex-rs/core/src/compact_remote_v2.rs" ], "source_state": "merged", - "subject_id": "25649", + "subject_id": "25946", "subject_kind": "pr", "surface_hints": [ - "release_packaging", - "tests_ci" + "internal_churn" ], - "title": "[codex] Publish release symbol artifacts", - "url": "https://github.com/openai/codex/pull/25649" + "title": "[codex-analytics] report compaction request token counts", + "url": "https://github.com/openai/codex/pull/25946" }, { "attention_flags": [ + "auth_account", + "deprecated_removed", "new_feature", + "protocol_change", "release_packaging" ], - "changed_file_count": 4, + "changed_file_count": 9, "commit_shas": [ - "e5655c7581cccc6deeb69c0299fa94670df6227a", - "278e87e3e6f8c508b8bb9695a478dde45fbdbb39", - "000561cd2237dc96c1c8e122bd793013a7cb0a9a", - "699944894ecc7db15a60d58d32b1637e6cd9e26e", - "1b3f0c3668c3ece3deb26f3e0af1b8a5d9fe6338", - "9616ce135e60ddd29713521b8a54cef07163b5f1", - "83919c4e3f76487a825ad8f78a8cb6a6b94eeeca", - "5afb526da9d9efa413c4dd0ad4359b4e17ce19b3", - "d0ef086e2fe4aacb5fc35be6da65fc4214c99721", - "562863c5c26e77defbe1be247979dcf0a9d6391b", - "365ac0ec81b2ddad895aff862b20583af3f3419b", - "cba4ad90f9ed9913e8f1035a7607219caeb47cd2" - ], - "committed_at": "2026-06-02T01:20:25Z", + "b90c27141080d8d1a19921bb3904d4dee383cdfb", + "5e622741e02c65760ac3dfc405bb89fada003b60", + "d8d2a18f775c94f60472ff1dd0d716afeb69db4f" + ], + "committed_at": "2026-06-04T03:34:51Z", "next_step": "ai_review_required", - "pr_number": 25683, - "pr_url": "https://github.com/openai/codex/pull/25683", + "pr_number": 26252, + "pr_url": "https://github.com/openai/codex/pull/26252", "review_priority": "normal", - "review_reason": "Needs AI review for new_feature, release_packaging.", + "review_reason": "Needs AI review for auth_account, deprecated_removed, new_feature, protocol_change, release_packaging.", "sample_paths": [ - ".github/workflows/ci.yml", - "justfile", - "scripts/format.py", - "sdk/python/tests/test_artifact_workflow_and_binaries.py" + ".github/CODEOWNERS", + ".github/actions/macos-code-sign/action.yml", + ".github/actions/macos-code-sign/notary_helpers.sh", + ".github/actions/setup-akv-pkcs11-codesigning/action.yaml", + ".github/scripts/macos-signing/codex.entitlements.plist", + ".github/scripts/macos-signing/notarize_macos_binary_with_rcodesign.sh", + ".github/scripts/macos-signing/notarize_macos_dmg_with_rcodesign.sh", + ".github/scripts/macos-signing/sign_macos_code.sh", + ".github/workflows/rust-release.yml" ], "source_state": "merged", - "subject_id": "25683", + "subject_id": "26252", "subject_kind": "pr", "surface_hints": [ + "release_packaging", "tests_ci" ], - "title": "[codex] Add comprehensive root formatting check", - "url": "https://github.com/openai/codex/pull/25683" + "title": "ci: sign macOS release artifacts with Azure Key Vault", + "url": "https://github.com/openai/codex/pull/26252" }, { "attention_flags": [ - "auth_account", "breaking_change", + "deprecated_removed", "new_feature", "protocol_change" ], - "changed_file_count": 1, - "commit_shas": [ - "ba8814c248d629d3dea8ccc8acc6ab6a184ec632", - "720a2f45d3f67ab414f5a56a6ebe2db5f267e3f7", - "1fb0583d2056474a02c94c961670de46aeb918ea", - "5db9c53727e1cb2c8d8fd7f53312ef92ec606177" - ], - "committed_at": "2026-06-02T01:41:04Z", - "next_step": "ai_review_required", - "pr_number": 25738, - "pr_url": "https://github.com/openai/codex/pull/25738", - "review_priority": "normal", - "review_reason": "Needs AI review for auth_account, breaking_change, new_feature, protocol_change.", - "sample_paths": [ - "AGENTS.md" - ], - "source_state": "merged", - "subject_id": "25738", - "subject_kind": "pr", - "surface_hints": [ - "internal_churn" - ], - "title": "Move code review rules into AGENTS", - "url": "https://github.com/openai/codex/pull/25738" - }, - { - "attention_flags": [ - "new_feature" - ], - "changed_file_count": 2, + "changed_file_count": 5, "commit_shas": [ - "2a107a3fe2c6a0c202a17cb77b941a610364cbb1", - "4316100ef65572ab681e49596a104c2e9dee76ca" + "f5da38291b3bd93c757b343dbd22e249bd3f7c21", + "fc0492a9a75cab47a635590ee51092040b605ccf", + "da6a6f58b42e4c33086521ef52669ebcc95d481b" ], - "committed_at": "2026-06-02T06:33:02Z", + "committed_at": "2026-06-04T12:44:45Z", "next_step": "ai_review_required", - "pr_number": 25782, - "pr_url": "https://github.com/openai/codex/pull/25782", + "pr_number": 26147, + "pr_url": "https://github.com/openai/codex/pull/26147", "review_priority": "normal", - "review_reason": "Needs AI review for new_feature.", + "review_reason": "Needs AI review for breaking_change, deprecated_removed, new_feature, protocol_change.", "sample_paths": [ - "codex-rs/core-skills/src/loader.rs", - "codex-rs/core-skills/src/loader_tests.rs" + "codex-rs/core/src/codex_thread.rs", + "codex-rs/core/src/lib.rs", + "codex-rs/core/src/session/inject.rs", + "codex-rs/core/src/session/tests.rs", + "codex-rs/ext/goal/src/runtime.rs" ], "source_state": "merged", - "subject_id": "25782", + "subject_id": "26147", "subject_kind": "pr", "surface_hints": [ "tests_ci" ], - "title": "[codex] Validate plugin skill base names", - "url": "https://github.com/openai/codex/pull/25782" + "title": "Gate automatic idle turns in Plan mode", + "url": "https://github.com/openai/codex/pull/26147" }, { "attention_flags": [], - "changed_file_count": 1, + "changed_file_count": 2, "commit_shas": [ - "002c656ee455a9bba813dc60ce93ea4500bfc526" + "22880c3fd3675d0c6a1461dd12c8a58b9d902b62" ], - "committed_at": "2026-06-01T21:01:30Z", + "committed_at": "2026-06-03T14:47:34Z", "next_step": "ai_review_required", - "pr_number": 25689, - "pr_url": "https://github.com/openai/codex/pull/25689", + "pr_number": 26176, + "pr_url": "https://github.com/openai/codex/pull/26176", "review_priority": "low", - "review_reason": "Needs AI review because every recent upstream commit is tracked, but deterministic hints found only internal churn.", + "review_reason": "Needs AI review for surface hints: tests_ci.", "sample_paths": [ - "codex-rs/code-mode/src/description.rs" + "codex-rs/core/src/tools/handlers/multi_agents_tests.rs", + "codex-rs/core/src/tools/handlers/multi_agents_v2/close_agent.rs" ], "source_state": "merged", - "subject_id": "25689", + "subject_id": "26176", "subject_kind": "pr", "surface_hints": [ - "internal_churn" + "tests_ci" ], - "title": "[codex] Generalize deferred nested tool guidance", - "url": "https://github.com/openai/codex/pull/25689" + "title": "fix: main", + "url": "https://github.com/openai/codex/pull/26176" } ] } diff --git a/artifacts/github/reviews/openai-codex-pr-25469.review.json b/artifacts/github/reviews/openai-codex-pr-25469.review.json new file mode 100644 index 0000000..ad1f23c --- /dev/null +++ b/artifacts/github/reviews/openai-codex-pr-25469.review.json @@ -0,0 +1,66 @@ +{ + "schema": "upstream_review/v1", + "slug": "openai-codex-pr-25469", + "repo": "openai/codex", + "subject": { + "subject_kind": "pr", + "subject_id": "25469", + "commit_shas": [ + "cc0c295e8d848ddfe2f3205dbce32bfc4f4c04b6", + "5327fc53dc007e3b35f092145d616f0339b18f94", + "3ad459228152dd5a64a6b68d7fbc485ede24d6a0" + ] + }, + "source_refs": { + "items": [ + { + "kind": "pull_request", + "title": "[profile-switcher][rust] -- [1/2] Add app-server account session protocol", + "url": "https://github.com/openai/codex/pull/25469", + "meta": "Merged 2026-06-03T19:55:12Z" + }, + { + "kind": "commit", + "title": "Add app server account session protocol", + "url": "https://github.com/openai/codex/commit/cc0c295e8d848ddfe2f3205dbce32bfc4f4c04b6" + } + ] + }, + "reviewed_at": "2026-06-04T13:13:28Z", + "observed_change": "Codex added app-server v2 accountSession protocol types for Desktop profile switching plus backend account metadata fetching for workspace choices.", + "changed_surfaces": [ + "app-server v2 account protocol", + "Desktop profile-switcher protocol layer", + "backend account metadata client", + "generated TypeScript and JSON schema surface" + ], + "user_visible_path": "Desktop profile-switcher clients get protocol types for adding, listing, switching, and logging out account sessions, but the PR says app-server lifecycle behavior lands in a follow-up PR.", + "control_plane_relevance": "Decodex account-pool and app-server compatibility work should track accountSession methods separately from older account login/rate-limit surfaces.", + "compatibility_risk": "Clients that generate or mirror app-server v2 account schemas need to recognize the new accountSession protocol names and avoid assuming this PR alone implements saved-session lifecycle.", + "adoption_opportunity": "Use this as planning evidence for future Decodex account-session switching, but wait for lifecycle/storage follow-up before claiming operational support.", + "community_value": "The change previews a concrete Desktop profile-switcher account-session API, useful as a cautious public watch item for account-management work.", + "deprecated_or_breaking_notes": "No removed behavior was found; this is protocol-layer addition with lifecycle behavior explicitly split into PR #25383.", + "confidence": "confirmed", + "evidence": [ + "PR #25469 states it adds app-server v2 accountSession/* protocol used by Desktop profile switcher and backend account metadata needed for workspace choices.", + "PR #25469 states this is protocol layer only and lifecycle plus consolidated saved-session storage are split into follow-up PR #25383.", + "codex-rs/app-server-protocol/src/protocol/v2/account.rs adds AccountSessionsAddParams, AccountSessionsListParams, AccountSessionsLogoutParams, account-session response types, and account-entry metadata shapes.", + "codex-rs/backend-client/src/client.rs adds get_accounts_check for /api/codex/accounts/check or /wham/accounts/check depending on path style.", + "codex-rs/backend-client/src/types.rs adds AccountsCheckResponse and AccountEntry parsing, including list or map account payload shapes." + ], + "caveats": "The PR says tests were not run per requested scope and lifecycle behavior is deferred to PR #25383.", + "next_actions": [ + { + "type": "upstream_impact", + "reason": "The accountSession protocol affects Decodex account-pool and app-server compatibility planning." + }, + { + "type": "social_candidate", + "reason": "This can be a cautious public watch-note candidate without writing a social_post/v1 record." + }, + { + "type": "linear_followup", + "reason": "Decodex should track the follow-up lifecycle/storage PR before implementing profile switching support." + } + ] +} diff --git a/artifacts/github/reviews/openai-codex-pr-26106.review.json b/artifacts/github/reviews/openai-codex-pr-26106.review.json new file mode 100644 index 0000000..28a9e84 --- /dev/null +++ b/artifacts/github/reviews/openai-codex-pr-26106.review.json @@ -0,0 +1,62 @@ +{ + "schema": "upstream_review/v1", + "slug": "openai-codex-pr-26106", + "repo": "openai/codex", + "subject": { + "subject_kind": "pr", + "subject_id": "26106", + "commit_shas": [ + "7eff30bf8e3ecdc87e8fe95f089a666f3f95ba1f", + "554d22fecdec860db21fbd703a2f9d68cedf7869", + "4484addb9ae097cb097ac3e4dcffa665a22845e2" + ] + }, + "source_refs": { + "items": [ + { + "kind": "pull_request", + "title": "skills: resolve per-turn catalogs from turn input context", + "url": "https://github.com/openai/codex/pull/26106", + "meta": "Merged 2026-06-03T11:32:56Z" + }, + { + "kind": "commit", + "title": "feat: skills 2", + "url": "https://github.com/openai/codex/commit/7eff30bf8e3ecdc87e8fe95f089a666f3f95ba1f" + } + ] + }, + "reviewed_at": "2026-06-04T13:12:17Z", + "observed_change": "Codex moved skills catalog resolution from a turn-lifecycle placeholder into the turn-input contributor path so SkillListQuery can include per-turn executor authorities.", + "changed_surfaces": [ + "skills extension", + "extension turn-input contributor API", + "context fragment rendering", + "prompt/context injection plumbing" + ], + "user_visible_path": "No complete end-user skills prompt injection path ships in this PR; it prepares per-turn catalog resolution using turn environments and working directories.", + "control_plane_relevance": "Decodex should watch this because app/plugin/skill routing may soon depend on executor-scoped skill authorities supplied per turn rather than static session placeholders.", + "compatibility_risk": "Extension integrations that assumed TurnInputContributor returns raw ResponseItem values need to adapt to boxed ContextualUserFragment output if they track upstream extension APIs.", + "adoption_opportunity": "Track the follow-up prompt/context injection changes before adopting skills-extension behavior in Decodex docs or plugin routing.", + "community_value": "This is useful background for operators following Codex skills work, but the PR itself is mostly plumbing and explicitly leaves prompt injection for follow-up changes.", + "deprecated_or_breaking_notes": "The extension API return type changes from ResponseItem values to boxed contextual fragments; the PR body says prompt injection still needs later work.", + "confidence": "confirmed", + "evidence": [ + "PR #26106 states the previous TurnLifecycleContributor hook only had a turn id and could only seed a placeholder SkillListQuery.", + "codex-rs/ext/skills/src/extension.rs switches from TurnLifecycleContributor to TurnInputContributor and builds executor_authorities from TurnInputContext.environments.", + "codex-rs/ext/skills/src/provider.rs removes SkillListQuery::placeholder_for_turn.", + "codex-rs/ext/extension-api/src/contributors.rs changes TurnInputContributor::contribute to return boxed ContextualUserFragment values instead of ResponseItem values.", + "codex-rs/core/src/session/turn.rs maps contributed fragments into response items during turn input construction." + ], + "caveats": "The PR says local tests were not run and prompt/context injection still needs follow-up changes, so publication should be cautious.", + "next_actions": [ + { + "type": "upstream_impact", + "reason": "The skills extension plumbing may affect future Decodex plugin and skill-routing assumptions." + }, + { + "type": "social_candidate", + "reason": "This can be a cautious watch-note candidate if Publisher wants to track the skills arc without claiming a shipped user workflow." + } + ] +} diff --git a/artifacts/github/reviews/openai-codex-pr-26254.review.json b/artifacts/github/reviews/openai-codex-pr-26254.review.json new file mode 100644 index 0000000..cf12f17 --- /dev/null +++ b/artifacts/github/reviews/openai-codex-pr-26254.review.json @@ -0,0 +1,70 @@ +{ + "schema": "upstream_review/v1", + "slug": "openai-codex-pr-26254", + "repo": "openai/codex", + "subject": { + "subject_kind": "pr", + "subject_id": "26254", + "commit_shas": [ + "c677bf1f9c6b263c185fd65a4fe8da2a1eb8fed1", + "a44923c056afdde77ad82f620825d95df392e0f1" + ] + }, + "source_refs": { + "items": [ + { + "kind": "pull_request", + "title": "feat: catalog multi-agent v2 config", + "url": "https://github.com/openai/codex/pull/26254", + "meta": "Merged 2026-06-03T22:24:40Z" + }, + { + "kind": "commit", + "title": "feat: catalog multi-agent v2 config", + "url": "https://github.com/openai/codex/commit/c677bf1f9c6b263c185fd65a4fe8da2a1eb8fed1" + } + ] + }, + "reviewed_at": "2026-06-04T13:12:17Z", + "observed_change": "Codex now validates only explicit features.multi_agent_v2 plus agents.max_threads as incompatible while allowing catalog-selected MultiAgentV2 models to ignore the legacy v1 thread cap.", + "changed_surfaces": [ + "MultiAgentV2 config validation", + "model catalog runtime selection", + "agent concurrency calculation", + "session startup validation", + "model-runtime selector tests" + ], + "user_visible_path": "Users whose model metadata selects MultiAgentV2 can keep older agents.max_threads config without startup rejection as long as they have not explicitly enabled features.multi_agent_v2.", + "control_plane_relevance": "Decodex should distinguish explicit user-enabled MultiAgentV2 from catalog-forced v2 when interpreting config errors, generated guidance, and operator compatibility checks.", + "compatibility_risk": "Docs or adapters that state all MultiAgentV2 sessions reject agents.max_threads are now too broad; only the explicit feature flag combination is rejected.", + "adoption_opportunity": "Update Decodex config guidance and release summaries to explain the narrower incompatibility and catalog-selected v2 behavior.", + "community_value": "This is a practical migration note for MultiAgentV2 users who still carry legacy agents.max_threads settings.", + "deprecated_or_breaking_notes": "features.multi_agent_v2 plus agents.max_threads remains invalid; catalog-selected v2 ignores the legacy v1 cap instead of rejecting config.", + "confidence": "confirmed", + "evidence": [ + "PR #26254 says model metadata can select MultiAgentV2 even when the user has not enabled features.multi_agent_v2.", + "codex-rs/core/src/config/mod.rs adds validate_multi_agent_v2_config that rejects agents.max_threads only when Feature::MultiAgentV2 is explicitly enabled.", + "effective_agent_max_threads now returns the v2 concurrency setting for MultiAgentVersion::V2 instead of rejecting agents.max_threads.", + "codex-rs/core/src/session/mod.rs calls validate_multi_agent_v2_config at startup rather than checking effective thread calculation for catalog-selected v2.", + "codex-rs/core/tests/suite/model_runtime_selectors.rs covers a remote model selecting v2 while config.agent_max_threads is set." + ], + "caveats": "The behavior depends on upstream model metadata selecting MultiAgentV2; users explicitly enabling features.multi_agent_v2 still need to remove agents.max_threads.", + "next_actions": [ + { + "type": "upstream_impact", + "reason": "The change affects Decodex MultiAgentV2 compatibility guidance and config validation assumptions." + }, + { + "type": "signal_entry", + "reason": "The narrower config incompatibility is a user-facing migration note suitable for a future public signal." + }, + { + "type": "social_candidate", + "reason": "The source evidence supports a practical public candidate for MultiAgentV2 config guidance." + }, + { + "type": "linear_followup", + "reason": "Decodex should audit generated MultiAgentV2 docs and config guidance for overly broad agents.max_threads warnings." + } + ] +} diff --git a/artifacts/github/social-candidates/.gitkeep b/artifacts/github/social-candidates/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/artifacts/github/social-candidates/.gitkeep @@ -0,0 +1 @@ + diff --git a/artifacts/github/social-candidates/openai-codex-pr-25469.json b/artifacts/github/social-candidates/openai-codex-pr-25469.json new file mode 100644 index 0000000..5fcd4a8 --- /dev/null +++ b/artifacts/github/social-candidates/openai-codex-pr-25469.json @@ -0,0 +1,53 @@ +{ + "schema": "social_candidate/v1", + "slug": "openai-codex-pr-25469", + "repo": "openai/codex", + "channel": "x", + "target_account": "decodexspace", + "mode": "watch_note", + "priority": "normal", + "audience": "Codex Desktop and app-server operators", + "candidate_text": [ + "Watch note: Codex upstream added accountSession protocol types for Desktop profile switching. Useful account-management signal, but lifecycle/storage behavior is in a follow-up PR." + ], + "source_refs": { + "upstream_reviews": [ + "artifacts/github/reviews/openai-codex-pr-25469.review.json" + ], + "upstream_impacts": [ + "artifacts/github/impact/openai-codex-pr-25469.json" + ], + "urls": [ + "https://github.com/openai/codex/pull/25469" + ] + }, + "evidence_notes": [ + "PR #25469 adds accountSession protocol for Desktop profile switching.", + "Backend account metadata fetching was added for workspace choices.", + "The PR body says lifecycle and saved-session storage are deferred to PR #25383." + ], + "claims": [ + { + "text": "Upstream Codex added accountSession protocol types for Desktop profile switching.", + "evidence": "artifacts/github/reviews/openai-codex-pr-25469.review.json", + "confidence": "confirmed" + }, + { + "text": "The change is protocol groundwork, not complete lifecycle behavior.", + "evidence": "artifacts/github/impact/openai-codex-pr-25469.json", + "confidence": "confirmed" + } + ], + "decision": { + "worthiness": "defer", + "reason": "The account-session direction is useful publicly, but the PR explicitly defers lifecycle and storage behavior.", + "idempotency_key": "x:decodexspace:openai-codex-pr-25469:watch_note" + }, + "caveats": [ + "Do not present this as complete profile switching support.", + "Prefer publishing after the lifecycle/storage follow-up is reviewed." + ], + "next_steps": [ + "Let release or Publisher automation combine this with PR #25383 if the follow-up lands in the current window." + ] +} diff --git a/artifacts/github/social-candidates/openai-codex-pr-26106.json b/artifacts/github/social-candidates/openai-codex-pr-26106.json new file mode 100644 index 0000000..8c1e895 --- /dev/null +++ b/artifacts/github/social-candidates/openai-codex-pr-26106.json @@ -0,0 +1,53 @@ +{ + "schema": "social_candidate/v1", + "slug": "openai-codex-pr-26106", + "repo": "openai/codex", + "channel": "x", + "target_account": "decodexspace", + "mode": "watch_note", + "priority": "normal", + "audience": "Codex plugin and skills operators", + "candidate_text": [ + "Watch note: Codex skills catalog resolution moved onto the per-turn input path, carrying executor authorities. This is plumbing for skills routing, not a complete try-now feature yet." + ], + "source_refs": { + "upstream_reviews": [ + "artifacts/github/reviews/openai-codex-pr-26106.review.json" + ], + "upstream_impacts": [ + "artifacts/github/impact/openai-codex-pr-26106.json" + ], + "urls": [ + "https://github.com/openai/codex/pull/26106" + ] + }, + "evidence_notes": [ + "PR #26106 moves skills from a turn-lifecycle placeholder to TurnInputContributor.", + "SkillListQuery now receives executor authorities from per-turn environments.", + "The PR body says prompt/context injection remains follow-up work." + ], + "claims": [ + { + "text": "Upstream Codex skills catalog resolution now uses per-turn input context.", + "evidence": "artifacts/github/reviews/openai-codex-pr-26106.review.json", + "confidence": "confirmed" + }, + { + "text": "The public angle should stay cautious because user-facing prompt injection is not complete in this PR.", + "evidence": "artifacts/github/impact/openai-codex-pr-26106.json", + "confidence": "confirmed" + } + ], + "decision": { + "worthiness": "defer", + "reason": "The change is source-backed and directionally important, but the PR explicitly leaves prompt injection for later work.", + "idempotency_key": "x:decodexspace:openai-codex-pr-26106:watch_note" + }, + "caveats": [ + "No complete end-user skills workflow is proven by this PR.", + "Prefer combining this with a later skills PR before publishing." + ], + "next_steps": [ + "Let release or Publisher automation roll this into a later skills summary if stronger evidence lands." + ] +} diff --git a/artifacts/github/social-candidates/openai-codex-pr-26254.json b/artifacts/github/social-candidates/openai-codex-pr-26254.json new file mode 100644 index 0000000..7c9d933 --- /dev/null +++ b/artifacts/github/social-candidates/openai-codex-pr-26254.json @@ -0,0 +1,54 @@ +{ + "schema": "social_candidate/v1", + "slug": "openai-codex-pr-26254", + "repo": "openai/codex", + "channel": "x", + "target_account": "decodexspace", + "mode": "practical_explainer", + "priority": "high", + "audience": "Codex MultiAgentV2 operators", + "candidate_text": [ + "MultiAgentV2 config nuance from Codex upstream: explicit features.multi_agent_v2 + agents.max_threads is still invalid, but catalog-selected v2 models can ignore that legacy v1 cap." + ], + "source_refs": { + "upstream_reviews": [ + "artifacts/github/reviews/openai-codex-pr-26254.review.json" + ], + "upstream_impacts": [ + "artifacts/github/impact/openai-codex-pr-26254.json" + ], + "urls": [ + "https://github.com/openai/codex/pull/26254" + ] + }, + "evidence_notes": [ + "PR #26254 narrows the incompatible config to explicit features.multi_agent_v2 plus agents.max_threads.", + "Config code separates startup validation from effective v2 concurrency calculation.", + "Model-runtime selector tests cover catalog-selected v2 while agent_max_threads is set." + ], + "claims": [ + { + "text": "Explicit features.multi_agent_v2 plus agents.max_threads remains invalid upstream.", + "evidence": "artifacts/github/reviews/openai-codex-pr-26254.review.json", + "confidence": "confirmed" + }, + { + "text": "Catalog-selected MultiAgentV2 can start while legacy agents.max_threads is present.", + "evidence": "artifacts/github/reviews/openai-codex-pr-26254.review.json", + "confidence": "confirmed" + } + ], + "decision": { + "worthiness": "publish", + "reason": "The change is a clear, source-backed config migration note with practical operator value.", + "idempotency_key": "x:decodexspace:openai-codex-pr-26254:practical_explainer" + }, + "caveats": [ + "Do not imply Decodex runtime adoption of upstream model catalog selectors.", + "Keep the explicit-feature incompatibility visible in any public copy." + ], + "next_steps": [ + "Let Publisher automation decide whether to produce a social_post/v1 publication, skip, or block record.", + "Consider pairing with a signal entry if Decodex publishes a MultiAgentV2 config update." + ] +} diff --git a/dev/skills/README.md b/dev/skills/README.md index bc9e605..a8ff202 100644 --- a/dev/skills/README.md +++ b/dev/skills/README.md @@ -39,7 +39,7 @@ explain what changed by themselves. Checked-in contracts for this workflow are `upstream_review_queue/v1`, `upstream_review/v1`, `github_change_bundle/v1`, `analysis_draft`, `signal_entry/v1`, -`upstream_impact/v1`, `release_delta/v1`, `social_post/v1`, and +`upstream_impact/v1`, `release_delta/v1`, `social_candidate/v1`, `social_post/v1`, and `reset_status/v1`. The triage, code-analysis, release-analysis, and reset-watch skills are reasoning passes unless their conclusions are promoted into one of those contracts. diff --git a/docs/index.md b/docs/index.md index 09fb734..a47bef8 100644 --- a/docs/index.md +++ b/docs/index.md @@ -60,7 +60,8 @@ The split below is by question type, not by human-versus-agent audience. analysis, GitHub signal drafting, or X publishing -> `dev/skills/` plus `docs/runbook/local-github-signal-workflow.md` - Need upstream Codex impact classification or social publishing contracts -> - `docs/spec/upstream-impact.md` and `docs/spec/social-publishing.md` + `docs/spec/upstream-impact.md`, `docs/spec/social-candidate.md`, and + `docs/spec/social-publishing.md` - Need the `@decodexspace` social publishing procedure -> `docs/runbook/social-publishing-workflow.md` - Need repository execution defaults or tracker-state policy -> registered project diff --git a/docs/spec/index.md b/docs/spec/index.md index 8011550..087dd82 100644 --- a/docs/spec/index.md +++ b/docs/spec/index.md @@ -77,6 +77,8 @@ Then keep the body explicit: the GitHub Release archive manifest contract. - [`upstream-impact.md`](./upstream-impact.md) defines how Radar classifies upstream Codex changes for public signals, Control Plane follow-up, and Publisher angles. +- [`social-candidate.md`](./social-candidate.md) defines source-backed public Publisher + handoff artifacts that are not publication records. - [`social-publishing.md`](./social-publishing.md) defines the checked-in social publication, block, skip, and failure records for `@decodexspace`. - [`site-contract.md`](./site-contract.md) defines the static-site page budget, diff --git a/docs/spec/social-candidate.md b/docs/spec/social-candidate.md new file mode 100644 index 0000000..e9078aa --- /dev/null +++ b/docs/spec/social-candidate.md @@ -0,0 +1,94 @@ +# Social Candidate + +Purpose: Define the checked-in Publisher candidate artifact produced by upstream Radar +source analysis before any social publication record is written. + +Status: normative + +Read this when: +- You are selecting source-backed upstream Codex changes for possible public + `@decodexspace` publishing. +- You need to hand off a Publisher opportunity without composing, posting, blocking, or + skipping an X publication. +- You are validating that public-candidate claims are backed by upstream review, + upstream-impact, signal, release-delta, or source URL evidence. + +Not this document: +- The publication, block, skip, or failure record. Read + [`social-publishing.md`](./social-publishing.md). +- The upstream source-analysis contract. Read [`upstream-review.md`](./upstream-review.md). +- The Control Plane impact bridge. Read [`upstream-impact.md`](./upstream-impact.md). + +Defines: +- The `social_candidate/v1` artifact shape. +- The boundary between upstream source analysis and later Publisher publication. + +## Artifact Identity + +The canonical schema identifier is: + +- `social_candidate/v1` + +Recommended checked-in location: + +- `artifacts/github/social-candidates/.json` + +`social_candidate/v1` is a handoff artifact, not a publication ledger entry. It must not +claim that a post was published, skipped, blocked, or failed. Downstream Publisher +automation may consume it to decide whether and when to write `social_post/v1`. + +## Required Fields + +| Field | Type | Notes | +| --- | --- | --- | +| `schema` | string | Must be `social_candidate/v1`. | +| `slug` | string | Stable URL-safe identifier, usually matching the source review slug. | +| `repo` | string | Upstream repository, such as `openai/codex`. | +| `channel` | string | Must be `x` for the current Publisher lane. | +| `target_account` | string | Must be `decodexspace`. | +| `mode` | string | One value from the social post modes in [`social-publishing.md`](./social-publishing.md). | +| `priority` | string | `critical`, `high`, `normal`, or `low`. | +| `audience` | string | Primary reader group for the later post. | +| `candidate_text` | array | One or more draftable post bodies, each no more than 280 characters. | +| `source_refs` | object | References to upstream review, upstream impact, signal, release-delta, or source URLs. | +| `evidence_notes` | array | Non-empty list of evidence-backed notes. | +| `claims` | array | Non-empty list of user-facing claims with evidence and confidence. | +| `decision` | object | Worthiness, reason, and idempotency key for downstream Publisher intake. | + +Optional fields: + +- `caveats`: rollout limits, version gates, uncertainty, or platform limits. +- `next_steps`: concrete downstream Publisher or editorial follow-up actions. + +## Source References + +`source_refs` must include at least one of: + +- `upstream_reviews` +- `upstream_impacts` +- `signals` +- `release_deltas` +- `urls` + +Prefer a source-backed `upstream_review/v1` plus an `upstream_impact/v1` when the +candidate comes from continuous Radar. + +## Decision Object + +`decision` must contain: + +| Field | Type | Notes | +| --- | --- | --- | +| `worthiness` | string | `publish`, `defer`, or `skip`. | +| `reason` | string | Short source-backed reason. | +| `idempotency_key` | string | Stable key derived from account, source, and mode. | + +## Boundary Rules + +- Do not write `social_post/v1` from the upstream source-analysis automation. +- Do not publish to X from a `social_candidate/v1` producer. +- Do not include claims that are not backed by `upstream_review/v1`, `upstream_impact/v1`, + `signal_entry/v1`, `release_delta/v1`, or source URLs. +- Do not imply Decodex runtime support unless Control Plane evidence exists. +- Use `social_candidate` as the upstream-review next action for public Publisher + opportunities that are not yet publication records. diff --git a/docs/spec/upstream-impact.md b/docs/spec/upstream-impact.md index 3fbf64f..31a8e79 100644 --- a/docs/spec/upstream-impact.md +++ b/docs/spec/upstream-impact.md @@ -17,6 +17,8 @@ Not this document: [`upstream-review.md`](./upstream-review.md). - The published site signal schema. Read [`signal-entry.md`](./signal-entry.md). - The social publishing schema. Read [`social-publishing.md`](./social-publishing.md). +- The social candidate handoff schema. Read + [`social-candidate.md`](./social-candidate.md). - The operator procedure for publishing. Read [`../runbook/social-publishing-workflow.md`](../runbook/social-publishing-workflow.md). @@ -109,6 +111,8 @@ summary. change came from continuous Radar. - It may support a `signal_entry/v1`. - It may support a `social_post/v1`. +- It may support a `social_candidate/v1` when upstream source analysis identifies a + public Publisher opportunity but does not publish. - It may justify a later Linear issue or implementation brief. It does not replace any of those artifacts. diff --git a/docs/spec/upstream-review.md b/docs/spec/upstream-review.md index a191512..19621fd 100644 --- a/docs/spec/upstream-review.md +++ b/docs/spec/upstream-review.md @@ -112,7 +112,7 @@ or public value. - confidence: `confirmed`, `likely`, or `weak` - source-backed evidence notes - next actions, each mapped to `none`, `upstream_impact`, `signal_entry`, - `social_post`, or `linear_followup` + `social_candidate`, `social_post`, or `linear_followup` AI review must read enough source evidence to explain behavior. A PR title, release title, or deterministic queue hint is not enough for a confirmed claim. @@ -133,8 +133,11 @@ Promote an upstream review into: or Publisher planning. - `signal_entry/v1` when it is community-ready and has user-visible capability, behavior, try path, or migration value. +- `social_candidate/v1` when there is a clear public angle and source links are + available, but the upstream review automation must not write a publication record. - `social_post/v1` when there is a clear public angle and source links are - available. + available and the Publisher workflow is actually publishing, blocking, skipping, or + recording failure. - a Linear issue when Decodex should adopt, guard, migrate, or investigate the change. Do not promote low-value internal churn into public artifacts. Keep it traceable in the