From 6816a2a5ac83af5ea9ace9a5340e400cede2347c Mon Sep 17 00:00:00 2001 From: Yvette Carlisle Date: Fri, 12 Jun 2026 16:12:54 +0800 Subject: [PATCH 1/2] {"schema":"decodex/commit/1","summary":"Persist upstream Radar review artifacts","authority":"manual"} --- .../github/bundles/openai-codex-pr-27420.json | 153 +++++ .../github/bundles/openai-codex-pr-27433.json | 78 +++ .../github/bundles/openai-codex-pr-27490.json | 137 +++++ .../github/bundles/openai-codex-pr-27646.json | 50 ++ .../github/impact/openai-codex-pr-27420.json | 48 ++ .../github/impact/openai-codex-pr-27433.json | 46 ++ .../github/impact/openai-codex-pr-27490.json | 44 ++ .../github/impact/openai-codex-pr-27646.json | 45 ++ .../review-queue/openai-codex-latest.json | 565 ++++++++++-------- .../reviews/openai-codex-pr-27420.review.json | 64 ++ .../reviews/openai-codex-pr-27433.review.json | 57 ++ .../reviews/openai-codex-pr-27490.review.json | 63 ++ .../reviews/openai-codex-pr-27646.review.json | 58 ++ .../openai-codex-pr-27420.json | 53 ++ .../openai-codex-pr-27646.json | 55 ++ 15 files changed, 1276 insertions(+), 240 deletions(-) create mode 100644 artifacts/github/bundles/openai-codex-pr-27420.json create mode 100644 artifacts/github/bundles/openai-codex-pr-27433.json create mode 100644 artifacts/github/bundles/openai-codex-pr-27490.json create mode 100644 artifacts/github/bundles/openai-codex-pr-27646.json create mode 100644 artifacts/github/impact/openai-codex-pr-27420.json create mode 100644 artifacts/github/impact/openai-codex-pr-27433.json create mode 100644 artifacts/github/impact/openai-codex-pr-27490.json create mode 100644 artifacts/github/impact/openai-codex-pr-27646.json create mode 100644 artifacts/github/reviews/openai-codex-pr-27420.review.json create mode 100644 artifacts/github/reviews/openai-codex-pr-27433.review.json create mode 100644 artifacts/github/reviews/openai-codex-pr-27490.review.json create mode 100644 artifacts/github/reviews/openai-codex-pr-27646.review.json create mode 100644 artifacts/github/social-candidates/openai-codex-pr-27420.json create mode 100644 artifacts/github/social-candidates/openai-codex-pr-27646.json diff --git a/artifacts/github/bundles/openai-codex-pr-27420.json b/artifacts/github/bundles/openai-codex-pr-27420.json new file mode 100644 index 000000000..4701b082a --- /dev/null +++ b/artifacts/github/bundles/openai-codex-pr-27420.json @@ -0,0 +1,153 @@ +{ + "analysis_mode": "pr_first", + "commits": [ + { + "author": "charlesgong-openai", + "committed_at": "2026-06-10T17:27:52Z", + "message": "Propagate plugin app categories", + "sha": "2f6191ea633cd0a58580c484cc37d88191787385", + "url": "https://github.com/openai/codex/commit/2f6191ea633cd0a58580c484cc37d88191787385" + } + ], + "default_branch": "main", + "docs_refs": [], + "examples_refs": [], + "extracted_flags": [ + "EXPERIMENTAL", + "REMOTE_PLUGIN_ID", + "AUTHORIZATION", + "DEFAULT_TIMEOUT", + "JSONRPCR", + "UNAUTHORIZED", + "BAD_REQUEST" + ], + "files": [ + { + "additions": 12, + "deletions": 0, + "patch_excerpt": "@@ -6416,6 +6416,12 @@\n \"AppSummary\": {\n \"description\": \"EXPERIMENTAL - app metadata summary for plugin responses.\",\n \"properties\": {\n+ \"category\": {\n+ \"type\": [\n+ \"string\",\n+ \"null\"\n+ ]\n+ },\n \"description\": {\n \"type\": [\n \"string\",\n@@ -6449,6 +6455,12 @@\n \"null\"\n ]\n },\n+ \"category\": {\n+ \"type\": [\n+ \"string\",\n+ \"null\"\n+ ]\n+ },\n \"description\": {\n \"type\": [\n \"string\",", + "path": "codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.schemas.json", + "status": "modified" + }, + { + "additions": 12, + "deletions": 0, + "patch_excerpt": "@@ -694,6 +694,12 @@\n \"AppSummary\": {\n \"description\": \"EXPERIMENTAL - app metadata summary for plugin responses.\",\n \"properties\": {\n+ \"category\": {\n+ \"type\": [\n+ \"string\",\n+ \"null\"\n+ ]\n+ },\n \"description\": {\n \"type\": [\n \"string\",\n@@ -727,6 +733,12 @@\n \"null\"\n ]\n },\n+ \"category\": {\n+ \"type\": [\n+ \"string\",\n+ \"null\"\n+ ]\n+ },\n \"description\": {\n \"type\": [\n \"string\",", + "path": "codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.v2.schemas.json", + "status": "modified" + }, + { + "additions": 6, + "deletions": 0, + "patch_excerpt": "@@ -4,6 +4,12 @@\n \"AppSummary\": {\n \"description\": \"EXPERIMENTAL - app metadata summary for plugin responses.\",\n \"properties\": {\n+ \"category\": {\n+ \"type\": [\n+ \"string\",\n+ \"null\"\n+ ]\n+ },\n \"description\": {\n \"type\": [\n \"string\",", + "path": "codex-rs/app-server-protocol/schema/json/v2/PluginInstallResponse.json", + "status": "modified" + }, + { + "additions": 12, + "deletions": 0, + "patch_excerpt": "@@ -8,6 +8,12 @@\n \"AppSummary\": {\n \"description\": \"EXPERIMENTAL - app metadata summary for plugin responses.\",\n \"properties\": {\n+ \"category\": {\n+ \"type\": [\n+ \"string\",\n+ \"null\"\n+ ]\n+ },\n \"description\": {\n \"type\": [\n \"string\",\n@@ -41,6 +47,12 @@\n \"null\"\n ]\n },\n+ \"category\": {\n+ \"type\": [\n+ \"string\",\n+ \"null\"\n+ ]\n+ },\n \"description\": {\n \"type\": [\n \"string\",", + "path": "codex-rs/app-server-protocol/schema/json/v2/PluginReadResponse.json", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -5,4 +5,4 @@\n /**\n * EXPERIMENTAL - app metadata summary for plugin responses.\n */\n-export type AppSummary = { id: string, name: string, description: string | null, installUrl: string | null, };\n+export type AppSummary = { id: string, name: string, description: string | null, installUrl: string | null, category: string | null, };", + "path": "codex-rs/app-server-protocol/schema/typescript/v2/AppSummary.ts", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -3,4 +3,4 @@\n // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.\n import type { AppTemplateUnavailableReason } from \"./AppTemplateUnavailableReason\";\n \n-export type AppTemplateSummary = { templateId: string, name: string, description: string | null, canonicalConnectorId: string | null, logoUrl: string | null, logoUrlDark: string | null, materializedAppIds: Array, reason: AppTemplateUnavailableReason | null, };\n+export type AppTemplateSummary = { templateId: string, name: string, description: string | null, category: string | null, canonicalConnectorId: string | null, logoUrl: string | null, logoUrlDark: string | null, materializedAppIds: Array, reason: AppTemplateUnavailableReason | null, };", + "path": "codex-rs/app-server-protocol/schema/typescript/v2/AppTemplateSummary.ts", + "status": "modified" + }, + { + "additions": 30, + "deletions": 0, + "patch_excerpt": "@@ -102,6 +102,33 @@ pub struct AppInfo {\n pub plugin_display_names: Vec,\n }\n \n+impl AppInfo {\n+ pub fn category(&self) -> Option {\n+ self.branding\n+ .as_ref()\n+ .and_then(|branding| non_empty_category(branding.category.as_deref()))\n+ .or_else(|| {\n+ self.app_metadata\n+ .as_ref()\n+ .and_then(|metadata| metadata.categories.as_ref())\n+ .and_then(|categories| {\n+ categories\n+ .iter()\n+ .find_map(|category| non_empty_category(Some(category.as_str())))\n+ })\n+ })\n+ }\n+}\n+\n+fn non_empty_category(category: Option<&str>) -> Option {\n+ let category = category?.trim();\n+ if category.is_empty() {\n+ None\n+ } else {\n+ Some(categor...", + "path": "codex-rs/app-server-protocol/src/protocol/v2/apps.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 0, + "patch_excerpt": "@@ -661,6 +661,7 @@ pub struct AppTemplateSummary {\n pub template_id: String,\n pub name: String,\n pub description: Option,\n+ pub category: Option,\n pub canonical_connector_id: Option,\n pub logo_url: Option,\n pub logo_url_dark: Option,", + "path": "codex-rs/app-server-protocol/src/protocol/v2/plugin.rs", + "status": "modified" + }, + { + "additions": 62, + "deletions": 13, + "patch_excerpt": "@@ -1035,7 +1035,12 @@ impl PluginRequestProcessor {\n }\n None => None,\n };\n- let app_summaries = load_plugin_app_summaries(&config, &outcome.plugin.apps).await;\n+ let app_summaries = load_plugin_app_summaries(\n+ &config,\n+ &outcome.plugin.apps,\n+ &outcome.plugin.app_category_by_id,\n+ )\n+ .await;\n let visible_skills = outcome\n .plugin\n .skills\n@@ -1111,7 +1116,13 @@ impl PluginRequestProcessor {\n .cloned()\n .map(codex_plugin::AppConnectorId)\n .collect::>();\n- let app_summaries = load_plugin_app_summaries(&config, &plugin_apps).await;\n+ let app_category_by_id = remote_d...", + "path": "codex-rs/app-server/src/request_processors/plugins.rs", + "status": "modified" + }, + { + "additions": 19, + "deletions": 1, + "patch_excerpt": "@@ -292,14 +292,29 @@ async fn plugin_install_writes_remote_plugin_to_cloud_and_cache() -> Result<()>\n async fn plugin_install_uses_remote_apps_needing_auth_response() -> Result<()> {\n let codex_home = TempDir::new()?;\n let server = MockServer::start().await;\n+ let remote_app_manifest = json!({\n+ \"apps\": {\n+ \"alpha\": {\n+ \"id\": \"alpha\",\n+ \"category\": \"Developer Tools\"\n+ }\n+ }\n+ });\n let bundle_url = mount_remote_plugin_bundle(\n &server,\n /*status_code*/ 200,\n remote_plugin_bundle_tar_gz_bytes(\"linear\")?,\n )\n .await;\n configure_remote_plugin_with_apps_test(codex_home.path(), &server)?;\n- mount_remote_plugin_detail(&server, REMOTE_PLUGIN_ID, \"1.2.3\", Some(&bundle_url)).await;\n+ mount_remote_plugin_detail_with_app_manifest(\n+ &server,\n+ REMOTE_PLUGIN_ID,...", + "path": "codex-rs/app-server/tests/suite/v2/plugin_install.rs", + "status": "modified" + }, + { + "additions": 203, + "deletions": 1, + "patch_excerpt": "@@ -1,10 +1,22 @@\n+use std::sync::Arc;\n+use std::sync::Mutex as StdMutex;\n use std::time::Duration;\n \n use anyhow::Result;\n use app_test_support::ChatGptAuthFixture;\n use app_test_support::TestAppServer;\n use app_test_support::to_response;\n use app_test_support::write_chatgpt_auth;\n+use axum::Json;\n+use axum::Router;\n+use axum::extract::State;\n+use axum::http::HeaderMap;\n+use axum::http::StatusCode;\n+use axum::http::Uri;\n+use axum::http::header::AUTHORIZATION;\n+use axum::routing::get;\n+use codex_app_server_protocol::AppInfo;\n+use codex_app_server_protocol::AppMetadata;\n use codex_app_server_protocol::AppTemplateSummary;\n use codex_app_server_protocol::AppTemplateUnavailableReason;\n use codex_app_server_protocol::HookEventName;\n@@ -27,6 +39,8 @@ use codex_utils_absolute_path::AbsolutePathBuf;\n use pretty_assertions::assert_eq;\n use serde_json::json;\n use tempfile::TempDir;\n+use tokio::net...", + "path": "codex-rs/app-server/tests/suite/v2/plugin_read.rs", + "status": "modified" + }, + { + "additions": 61, + "deletions": 14, + "patch_excerpt": "@@ -61,6 +61,12 @@ pub struct PluginHookLoadOutcome {\n pub hook_load_warnings: Vec,\n }\n \n+#[derive(Debug, Clone, PartialEq, Eq)]\n+pub struct PluginAppMetadata {\n+ pub id: AppConnectorId,\n+ pub category: Option,\n+}\n+\n enum PluginLoadScope<'a> {\n AllCapabilities {\n restriction_product: Option,\n@@ -123,6 +129,7 @@ struct PluginAppFile {\n #[derive(Debug, Default, Deserialize)]\n struct PluginAppConfig {\n id: String,\n+ category: Option,\n }\n \n pub async fn load_plugins_from_layer_stack(\n@@ -848,6 +855,14 @@ fn default_mcp_config_paths(plugin_root: &Path) -> Vec {\n }\n \n pub async fn load_plugin_apps(plugin_root: &Path) -> Vec {\n+ load_plugin_app_metadata(plugin_root)\n+ .await\n+ .into_iter()\n+ .map(|app| app.id)\n+ .collect()\n+}\n+\n+pub async fn load_plugin_app_metadata(plug...", + "path": "codex-rs/core-plugins/src/loader.rs", + "status": "modified" + }, + { + "additions": 10, + "deletions": 2, + "patch_excerpt": "@@ -5,7 +5,7 @@ use crate::loader::PluginHookLoadOutcome;\n use crate::loader::configured_curated_plugin_ids_from_codex_home;\n use crate::loader::curated_plugin_cache_version;\n use crate::loader::installed_plugin_telemetry_metadata;\n-use crate::loader::load_plugin_apps;\n+use crate::loader::load_plugin_app_metadata;\n use crate::loader::load_plugin_hooks;\n use crate::loader::load_plugin_hooks_from_layer_stack;\n use crate::loader::load_plugin_mcp_servers;\n@@ -254,6 +254,7 @@ pub struct PluginDetail {\n pub disabled_skill_paths: HashSet,\n pub hooks: Vec,\n pub apps: Vec,\n+ pub app_category_by_id: HashMap,\n pub mcp_server_names: Vec,\n pub details_unavailable_reason: Option,\n }\n@@ -1224,6 +1225,7 @@ impl PluginsManager {\n disabled_skill_paths: HashSet:...", + "path": "codex-rs/core-plugins/src/manager.rs", + "status": "modified" + }, + { + "additions": 4, + "deletions": 0, + "patch_excerpt": "@@ -178,6 +178,7 @@ pub struct RemoteAppTemplate {\n pub template_id: String,\n pub name: String,\n pub description: Option,\n+ pub category: Option,\n pub canonical_connector_id: Option,\n pub logo_url: Option,\n pub logo_url_dark: Option,\n@@ -458,6 +459,8 @@ struct RemoteAppTemplateResponse {\n #[serde(default)]\n description: Option,\n #[serde(default)]\n+ category: Option,\n+ #[serde(default)]\n canonical_connector_id: Option,\n #[serde(default)]\n logo_url: Option,\n@@ -1059,6 +1062,7 @@ async fn build_remote_plugin_detail(\n template_id: template.template_id,\n name: template.name,\n description: template.description,\n+ category: template.category,\n canonical_connector_id: template.canonical_conn...", + "path": "codex-rs/core-plugins/src/remote.rs", + "status": "modified" + }, + { + "additions": 8, + "deletions": 1, + "patch_excerpt": "@@ -307,10 +307,17 @@ def validate_app_manifest(path: Path, errors: list[str]) -> None:\n if not isinstance(value, dict):\n errors.append(f\"`.app.json` app `{key}` must be an object\")\n continue\n- reject_companion_unknown_fields(value, {\"id\"}, f\"`.app.json` app `{key}`\", errors)\n+ reject_companion_unknown_fields(\n+ value, {\"id\", \"category\"}, f\"`.app.json` app `{key}`\", errors\n+ )\n app_id = value.get(\"id\")\n if not isinstance(app_id, str) or not app_id.strip():\n errors.append(f\"`.app.json` app `{key}` field `id` must be a non-empty string\")\n+ category = value.get(\"category\")\n+ if category is not None and (not isinstance(category, str) or not category.strip()):\n+ errors.append(\n+ f\"`.app.json` app `{key}` field `category` must be a non-empty string\"\n+ )...", + "path": "codex-rs/skills/src/assets/samples/plugin-creator/scripts/validate_plugin.py", + "status": "modified" + }, + { + "additions": 1, + "deletions": 0, + "patch_excerpt": "@@ -1455,6 +1455,7 @@ pub(super) fn plugins_test_detail(\n name: (*name).to_string(),\n description: Some(format!(\"{name} app\")),\n install_url: Some(format!(\"https://example.test/{name}\")),\n+ category: None,\n })\n .collect(),\n app_templates: Vec::new(),", + "path": "codex-rs/tui/src/chatwidget/tests/helpers.rs", + "status": "modified" + } + ], + "linked_issues": [], + "notes": [ + "Built from GitHub pull-request, commits, files, and repo endpoints." + ], + "primary_pr": { + "body": "## What\r\n- Parse optional `.app.json` `category` overrides for plugin apps.\r\n- Add nullable `category` to `AppSummary` and `AppTemplateSummary` in the app-server protocol.\r\n- Fall back from `branding.category` to the first non-empty `app_metadata.categories` value when building app/template summaries.\r\n- Regenerate schema/type fixtures and update plugin read/install tests.\r\n\r\n## Why\r\nThe plugin details UI needs a normalized per-app category. Some apps only provide their default category in metadata, while others need a local `.app.json` override.\r\n", + "labels": [], + "merged_at": "2026-06-11T17:34:41Z", + "number": 27420, + "state": "merged", + "title": "[codex] Propagate plugin app categories", + "url": "https://github.com/openai/codex/pull/27420" + }, + "repo": "openai/codex", + "schema": "github_change_bundle/v1" +} diff --git a/artifacts/github/bundles/openai-codex-pr-27433.json b/artifacts/github/bundles/openai-codex-pr-27433.json new file mode 100644 index 000000000..619fcec2f --- /dev/null +++ b/artifacts/github/bundles/openai-codex-pr-27433.json @@ -0,0 +1,78 @@ +{ + "analysis_mode": "pr_first", + "commits": [ + { + "author": "anp-oai", + "committed_at": "2026-06-10T00:19:56Z", + "message": "Remove EnvironmentPathRef", + "sha": "a8e9807f4a94cf84b288c0c9ce2678788c9d3228", + "url": "https://github.com/openai/codex/commit/a8e9807f4a94cf84b288c0c9ce2678788c9d3228" + } + ], + "default_branch": "main", + "docs_refs": [], + "examples_refs": [], + "extracted_flags": [ + "LOCAL_FS", + "UTF", + "SKILL", + "LOCAL_ENVIRONMENT_ID", + "REMOTE_ENVIRONMENT_ID", + "CODEX_FS_HELPER_ARG1", + "SKILL_CONTENTS" + ], + "files": [ + { + "additions": 0, + "deletions": 527, + "patch_excerpt": "@@ -1,527 +0,0 @@\n-use std::fmt;\n-use std::hash::Hash;\n-use std::hash::Hasher;\n-use std::io;\n-use std::path::Path;\n-use std::sync::Arc;\n-\n-use codex_utils_absolute_path::AbsolutePathBuf;\n-\n-use crate::ExecutorFileSystem;\n-use crate::FileMetadata;\n-use crate::FileSystemSandboxContext;\n-use crate::LOCAL_FS;\n-use crate::ReadDirectoryEntry;\n-\n-/// Binds an absolute path to the executor filesystem that owns it.\n-#[derive(Clone)]\n-pub struct EnvironmentPathRef {\n- file_system: Arc,\n- path: AbsolutePathBuf,\n-}\n-\n-impl EnvironmentPathRef {\n- /// Creates a path ref bound to the filesystem that owns `path`.\n- pub fn new(file_system: Arc, path: AbsolutePathBuf) -> Self {\n- Self { file_system, path }\n- }\n-\n- /// Creates a path ref bound to the shared unsandboxed local filesystem.\n- pub fn local(path: AbsolutePathBuf) -> Self...", + "path": "codex-rs/exec-server/src/environment_path.rs", + "status": "removed" + }, + { + "additions": 0, + "deletions": 2, + "patch_excerpt": "@@ -3,7 +3,6 @@ mod client_api;\n mod client_transport;\n mod connection;\n mod environment;\n-mod environment_path;\n mod environment_provider;\n mod environment_toml;\n mod fs_helper;\n@@ -44,7 +43,6 @@ pub use environment::Environment;\n pub use environment::EnvironmentManager;\n pub use environment::LOCAL_ENVIRONMENT_ID;\n pub use environment::REMOTE_ENVIRONMENT_ID;\n-pub use environment_path::EnvironmentPathRef;\n pub use environment_provider::DefaultEnvironmentProvider;\n pub use environment_provider::EnvironmentProvider;\n pub use fs_helper::CODEX_FS_HELPER_ARG1;", + "path": "codex-rs/exec-server/src/lib.rs", + "status": "modified" + }, + { + "additions": 21, + "deletions": 6, + "patch_excerpt": "@@ -1,5 +1,5 @@\n use codex_core_skills::model::SkillDependencies;\n-use codex_exec_server::EnvironmentPathRef;\n+use codex_utils_absolute_path::AbsolutePathBuf;\n \n /// Source authority that owns a skill package and must be used to read it.\n #[derive(Clone, Debug, PartialEq, Eq, Hash)]\n@@ -62,7 +62,7 @@ pub struct SkillPackageId(pub String);\n #[derive(Clone, Debug, PartialEq, Eq, Hash)]\n pub struct SkillResourceId {\n id: String,\n- environment_path: Option,\n+ environment_path: Option,\n }\n \n impl SkillResourceId {\n@@ -73,22 +73,37 @@ impl SkillResourceId {\n }\n }\n \n- pub fn environment(id: impl Into, path: EnvironmentPathRef) -> Self {\n+ pub fn environment(\n+ id: impl Into,\n+ environment_id: impl Into,\n+ path: AbsolutePathBuf,\n+ ) -> Self {\n Self {\n id: ...", + "path": "codex-rs/ext/skills/src/catalog.rs", + "status": "modified" + }, + { + "additions": 13, + "deletions": 7, + "patch_excerpt": "@@ -6,7 +6,6 @@ use codex_core_skills::filter_skill_load_outcome_for_product;\n use codex_core_skills::loader::SkillRoot;\n use codex_core_skills::loader::load_skills_from_roots;\n use codex_exec_server::EnvironmentManager;\n-use codex_exec_server::EnvironmentPathRef;\n use codex_protocol::capabilities::CapabilityRootLocation;\n use codex_protocol::protocol::Product;\n use codex_protocol::protocol::SkillScope;\n@@ -99,7 +98,7 @@ impl SkillProvider for ExecutorSkillProvider {\n enabled,\n authority.clone(),\n &selected_root_id,\n- Arc::clone(&file_system),\n+ &environment_id,\n ));\n }\n }\n@@ -121,13 +120,19 @@ impl SkillProvider for ExecutorSkillProvider {\n \"executor skill resource does not match its package\",\n ...", + "path": "codex-rs/ext/skills/src/provider/executor.rs", + "status": "modified" + }, + { + "additions": 0, + "deletions": 60, + "patch_excerpt": "@@ -21,10 +21,8 @@ use codex_protocol::capabilities::CapabilityRootLocation;\n use codex_protocol::capabilities::SelectedCapabilityRoot;\n use codex_protocol::protocol::SkillScope;\n use codex_skills_extension::ExecutorSkillProvider;\n-use codex_skills_extension::catalog::SkillReadResult;\n use codex_skills_extension::provider::SkillListQuery;\n use codex_skills_extension::provider::SkillProvider;\n-use codex_skills_extension::provider::SkillReadRequest;\n use codex_utils_absolute_path::AbsolutePathBuf;\n use pretty_assertions::assert_eq;\n \n@@ -202,64 +200,6 @@ async fn skill_loading_and_reads_use_the_supplied_executor_file_system() {\n );\n }\n \n-#[tokio::test]\n-async fn executor_provider_reads_from_the_environment_instance_used_for_listing() {\n- let test_root = create_local_skill_root(\"bound-instance\").expect(\"create local skill root\");\n- let root_path = test_root.to_string_lossy().into_...", + "path": "codex-rs/ext/skills/tests/executor_file_system_authority.rs", + "status": "modified" + } + ], + "linked_issues": [ + "#27454" + ], + "notes": [ + "Built from GitHub pull-request, commits, files, and repo endpoints." + ], + "primary_pr": { + "body": "We're switching to using a static encoding of the host path in `PathUri`. We may need a type like this again but we can add it when it's more compelling.\n\nStacked on #27454.", + "labels": [], + "merged_at": "2026-06-11T18:26:13Z", + "number": 27433, + "state": "merged", + "title": "[codex] remove EnvironmentPathRef", + "url": "https://github.com/openai/codex/pull/27433" + }, + "repo": "openai/codex", + "schema": "github_change_bundle/v1" +} diff --git a/artifacts/github/bundles/openai-codex-pr-27490.json b/artifacts/github/bundles/openai-codex-pr-27490.json new file mode 100644 index 000000000..5c44768ba --- /dev/null +++ b/artifacts/github/bundles/openai-codex-pr-27490.json @@ -0,0 +1,137 @@ +{ + "analysis_mode": "pr_first", + "commits": [ + { + "author": "etraut-openai", + "committed_at": "2026-06-10T23:22:54Z", + "message": "tui: remove legacy core Windows sandbox facade", + "sha": "69b921aa666b1059422309b6ab7f4cd1a03b65c9", + "url": "https://github.com/openai/codex/commit/69b921aa666b1059422309b6ab7f4cd1a03b65c9" + }, + { + "author": "etraut-openai", + "committed_at": "2026-06-10T23:37:24Z", + "message": "tui: document remote Windows sandbox gap", + "sha": "44494bb402287988f3faf7590d0ea284ae234657", + "url": "https://github.com/openai/codex/commit/44494bb402287988f3faf7590d0ea284ae234657" + } + ], + "default_branch": "main", + "docs_refs": [], + "examples_refs": [], + "extracted_flags": [ + "TUI", + "TODO", + "ELEVATED_SANDBOX_NUX_ENABLED", + "SHUTDOWN_TIMEOUT", + "RPC" + ], + "files": [ + { + "additions": 0, + "deletions": 5, + "patch_excerpt": "@@ -77,7 +77,6 @@ pub use crate::remote::RemoteAppServerEndpoint;\n pub mod legacy_core {\n pub use codex_core::check_execpolicy_for_warnings;\n pub use codex_core::format_exec_policy_error_with_source;\n- pub use codex_core::grant_read_root_non_elevated;\n \n pub mod config {\n pub use codex_core::config::*;\n@@ -86,10 +85,6 @@ pub mod legacy_core {\n pub use codex_core::config::edit::*;\n }\n }\n-\n- pub mod windows_sandbox {\n- pub use codex_core::windows_sandbox::*;\n- }\n }\n \n const SHUTDOWN_TIMEOUT: Duration = Duration::from_secs(5);", + "path": "codex-rs/app-server-client/src/lib.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 3, + "patch_excerpt": "@@ -51,8 +51,6 @@ use crate::legacy_core::config::ConfigBuilder;\n use crate::legacy_core::config::ConfigOverrides;\n use crate::legacy_core::config::PermissionProfileSnapshot;\n use crate::legacy_core::config::edit::ConfigEditsBuilder;\n-#[cfg(target_os = \"windows\")]\n-use crate::legacy_core::windows_sandbox::WindowsSandboxLevelExt;\n use crate::model_catalog::ModelCatalog;\n use crate::model_migration::ModelMigrationOutcome;\n use crate::model_migration::migration_copy_for_models;\n@@ -1063,7 +1061,7 @@ See the Codex keymap documentation for supported actions and examples.\"\n #[cfg(target_os = \"windows\")]\n {\n let startup_permission_profile = app.config.permissions.effective_permission_profile();\n- let should_check = WindowsSandboxLevel::from_config(&app.config)\n+ let should_check = crate::windows_sandbox::level_from_config(&app.config)\n ...", + "path": "codex-rs/tui/src/app.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -964,7 +964,7 @@ impl App {\n fn propagate_windows_sandbox_turn_context(&self) {\n #[cfg(target_os = \"windows\")]\n {\n- let windows_sandbox_level = WindowsSandboxLevel::from_config(&self.config);\n+ let windows_sandbox_level = crate::windows_sandbox::level_from_config(&self.config);\n self.app_event_tx\n .send(AppEvent::CodexOp(AppCommand::override_turn_context(\n /*cwd*/ None,", + "path": "codex-rs/tui/src/app/config_persistence.rs", + "status": "modified" + }, + { + "additions": 9, + "deletions": 13, + "patch_excerpt": "@@ -949,9 +949,7 @@ impl App {\n \n // If the elevated setup already ran on this machine, don't prompt for\n // elevation again - just flip the config to use the elevated path.\n- if crate::legacy_core::windows_sandbox::sandbox_setup_is_complete(\n- codex_home.as_path(),\n- ) {\n+ if crate::windows_sandbox::sandbox_setup_is_complete(codex_home.as_path()) {\n tx.send(AppEvent::EnableWindowsSandboxForAgentMode {\n preset,\n mode: WindowsSandboxEnableMode::Elevated,\n@@ -964,7 +962,7 @@ impl App {\n self.windows_sandbox.setup_started_at = Some(Instant::now());\n let session_telemetry = self.session_telemetry.clone();\n tokio::task::spawn_blocking(mo...", + "path": "codex-rs/tui/src/app/event_dispatch.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 3, + "patch_excerpt": "@@ -60,8 +60,6 @@ use crate::diff_model::FileChange;\n use crate::git_action_directives::parse_assistant_markdown;\n use crate::legacy_core::config::Config;\n use crate::legacy_core::config::PermissionProfileSnapshot;\n-#[cfg(any(target_os = \"windows\", test))]\n-use crate::legacy_core::windows_sandbox::WindowsSandboxLevelExt;\n use crate::mention_codec::LinkedMention;\n use crate::mention_codec::encode_history_mentions;\n use crate::model_catalog::ModelCatalog;\n@@ -265,7 +263,7 @@ use crate::app_event::AppEvent;\n use crate::app_event::ExitMode;\n use crate::app_event::PermissionProfileSelection;\n use crate::app_event::RateLimitRefreshOrigin;\n-#[cfg(any(target_os = \"windows\", test))]\n+#[cfg(target_os = \"windows\")]\n use crate::app_event::WindowsSandboxEnableMode;\n use crate::app_event_sender::AppEventSender;\n use crate::auto_review_denials;", + "path": "codex-rs/tui/src/chatwidget.rs", + "status": "modified" + }, + { + "additions": 6, + "deletions": 7, + "patch_excerpt": "@@ -251,13 +251,12 @@ impl ChatWidget {\n .bottom_pane\n .set_queued_message_edit_binding(widget.queued_message_edit_hint_binding);\n #[cfg(target_os = \"windows\")]\n- widget.bottom_pane.set_windows_degraded_sandbox_active(\n- crate::legacy_core::windows_sandbox::ELEVATED_SANDBOX_NUX_ENABLED\n- && matches!(\n- WindowsSandboxLevel::from_config(&widget.config),\n- WindowsSandboxLevel::RestrictedToken\n- ),\n- );\n+ widget\n+ .bottom_pane\n+ .set_windows_degraded_sandbox_active(matches!(\n+ crate::windows_sandbox::level_from_config(&widget.config),\n+ WindowsSandboxLevel::RestrictedToken\n+ ));\n widget.update_collaboration_mode_indicator();\n \n widget", + "path": "codex-rs/tui/src/chatwidget/constructor.rs", + "status": "modified" + }, + { + "additions": 8, + "deletions": 10, + "patch_excerpt": "@@ -29,17 +29,15 @@ impl ChatWidget {\n let presets: Vec = builtin_approval_presets();\n \n #[cfg(target_os = \"windows\")]\n- let windows_sandbox_level = WindowsSandboxLevel::from_config(&self.config);\n+ let windows_sandbox_level = crate::windows_sandbox::level_from_config(&self.config);\n #[cfg(target_os = \"windows\")]\n let windows_degraded_sandbox_enabled =\n matches!(windows_sandbox_level, WindowsSandboxLevel::RestrictedToken);\n #[cfg(not(target_os = \"windows\"))]\n let windows_degraded_sandbox_enabled = false;\n \n let show_elevate_sandbox_hint =\n- crate::legacy_core::windows_sandbox::ELEVATED_SANDBOX_NUX_ENABLED\n- && windows_degraded_sandbox_enabled\n- && presets.iter().any(|preset| preset.id == \"auto\");\n+ windows_degraded_sandbox_enabled && preset...", + "path": "codex-rs/tui/src/chatwidget/permission_popups.rs", + "status": "modified" + }, + { + "additions": 10, + "deletions": 14, + "patch_excerpt": "@@ -58,13 +58,11 @@ impl ChatWidget {\n pub(crate) fn set_windows_sandbox_mode(&mut self, mode: Option) {\n self.config.permissions.windows_sandbox_mode = mode;\n #[cfg(target_os = \"windows\")]\n- self.bottom_pane.set_windows_degraded_sandbox_active(\n- crate::legacy_core::windows_sandbox::ELEVATED_SANDBOX_NUX_ENABLED\n- && matches!(\n- WindowsSandboxLevel::from_config(&self.config),\n- WindowsSandboxLevel::RestrictedToken\n- ),\n- );\n+ self.bottom_pane\n+ .set_windows_degraded_sandbox_active(matches!(\n+ crate::windows_sandbox::level_from_config(&self.config),\n+ WindowsSandboxLevel::RestrictedToken\n+ ));\n }\n \n #[cfg_attr(not(target_os = \"windows\"), allow(dead_code))]\n@@ -121,13 +119,11 @@ impl ChatW...", + "path": "codex-rs/tui/src/chatwidget/settings.rs", + "status": "modified" + }, + { + "additions": 4, + "deletions": 5, + "patch_excerpt": "@@ -317,12 +317,11 @@ impl ChatWidget {\n SlashCommand::ElevateSandbox => {\n #[cfg(target_os = \"windows\")]\n {\n- let windows_sandbox_level = WindowsSandboxLevel::from_config(&self.config);\n+ let windows_sandbox_level =\n+ crate::windows_sandbox::level_from_config(&self.config);\n let windows_degraded_sandbox_enabled =\n matches!(windows_sandbox_level, WindowsSandboxLevel::RestrictedToken);\n- if !windows_degraded_sandbox_enabled\n- || !crate::legacy_core::windows_sandbox::ELEVATED_SANDBOX_NUX_ENABLED\n- {\n+ if !windows_degraded_sandbox_enabled {\n // This command should not be visible/recognized outside degraded mode,\n // bu...", + "path": "codex-rs/tui/src/chatwidget/slash_dispatch.rs", + "status": "modified" + }, + { + "additions": 3, + "deletions": 53, + "patch_excerpt": "@@ -15,17 +15,15 @@ impl ChatWidget {\n \n #[cfg(any(target_os = \"windows\", test))]\n pub(super) fn elevated_windows_sandbox_setup_required(&self) -> bool {\n- WindowsSandboxLevel::from_config(&self.config) == WindowsSandboxLevel::Elevated\n+ crate::windows_sandbox::level_from_config(&self.config) == WindowsSandboxLevel::Elevated\n && self\n .config\n .config_layer_stack\n .requirements()\n .windows_sandbox_mode\n .source\n .is_some()\n- && !crate::legacy_core::windows_sandbox::sandbox_setup_is_complete(\n- self.config.codex_home.as_path(),\n- )\n+ && !crate::windows_sandbox::sandbox_setup_is_complete(self.config.codex_home.as_path())\n }\n \n #[cfg(target_os = \"windows\")]\n@@ -226,54 +224,6 @@ impl ChatWidget {\n ) {\n ...", + "path": "codex-rs/tui/src/chatwidget/windows_sandbox_prompts.rs", + "status": "modified" + }, + { + "additions": 4, + "deletions": 6, + "patch_excerpt": "@@ -11,8 +11,6 @@ use crate::legacy_core::config::load_config_as_toml_with_cli_and_load_options;\n use crate::legacy_core::config::resolve_oss_provider;\n use crate::legacy_core::config::resolve_profile_v2_config_path;\n use crate::legacy_core::format_exec_policy_error_with_source;\n-#[cfg(target_os = \"windows\")]\n-use crate::legacy_core::windows_sandbox::WindowsSandboxLevelExt;\n use crate::session_resume::ResolveCwdOutcome;\n use crate::session_resume::resolve_cwd_for_resume_or_fork;\n pub use crate::startup_error::LocalStateDbStartupError;\n@@ -212,6 +210,8 @@ mod version;\n #[cfg(not(target_os = \"linux\"))]\n mod voice;\n mod width;\n+#[cfg(any(target_os = \"windows\", test))]\n+mod windows_sandbox;\n mod workspace_command;\n #[cfg(target_os = \"linux\")]\n #[allow(dead_code)]\n@@ -1741,7 +1741,7 @@ async fn run_ratatui_app(\n set_default_client_residency_requirement(config.enforce_residency.value());\n ...", + "path": "codex-rs/tui/src/lib.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 3, + "patch_excerpt": "@@ -36,8 +36,6 @@ use crate::config_update::format_config_error;\n use crate::config_update::write_trusted_project;\n use crate::key_hint::KeyBindingListExt;\n use crate::legacy_core::config::Config;\n-#[cfg(target_os = \"windows\")]\n-use crate::legacy_core::windows_sandbox::WindowsSandboxLevelExt;\n use crate::onboarding::auth::AuthModeWidget;\n use crate::onboarding::auth::SignInOption;\n use crate::onboarding::auth::SignInState;\n@@ -143,7 +141,7 @@ impl OnboardingScreen {\n }\n #[cfg(target_os = \"windows\")]\n let show_windows_create_sandbox_hint =\n- WindowsSandboxLevel::from_config(&config) == WindowsSandboxLevel::Disabled;\n+ crate::windows_sandbox::level_from_config(&config) == WindowsSandboxLevel::Disabled;\n #[cfg(not(target_os = \"windows\"))]\n let show_windows_create_sandbox_hint = false;\n let highlighted = TrustDirectorySele...", + "path": "codex-rs/tui/src/onboarding/onboarding_screen.rs", + "status": "modified" + }, + { + "additions": 122, + "deletions": 0, + "patch_excerpt": "@@ -0,0 +1,122 @@\n+//! TUI-owned Windows sandbox helpers retained while setup still runs in the local client process.\n+//!\n+//! TODO: These helpers inspect and modify the TUI host, so they do not support\n+//! cross-platform remote app servers. Move readiness and setup to the existing\n+//! `windowsSandbox/*` RPCs while preserving the pending permission profile,\n+//! use the server platform reported during initialization, and add a remote\n+//! equivalent for read-root grants.\n+\n+use crate::legacy_core::config::Config;\n+use codex_config::types::WindowsSandboxModeToml;\n+use codex_features::Feature;\n+use codex_protocol::config_types::WindowsSandboxLevel;\n+#[cfg(target_os = \"windows\")]\n+use codex_protocol::models::PermissionProfile;\n+#[cfg(target_os = \"windows\")]\n+use codex_utils_absolute_path::AbsolutePathBuf;\n+#[cfg(target_os = \"windows\")]\n+use std::collections::HashMap;\n+use std::path::Path...", + "path": "codex-rs/tui/src/windows_sandbox.rs", + "status": "added" + } + ], + "linked_issues": [], + "notes": [ + "Built from GitHub pull-request, commits, files, and repo endpoints." + ], + "primary_pr": { + "body": "## Why\r\n\r\nThis is part of an ongoing attempt to eliminate the TUI's direct dependency on core features. When we moved the TUI to the app server, we left a `legacy_core` shim that re-exported some remaining core symbols for the TUI. The intent was to eventually remove all of these. \r\n\r\nIn this PR, we remove the symbols related to the Windows sandbox.\r\n\r\nThe change should be behavior-neutral and low risk because it's just refactoring and removal of code that is now effectively dead.\r\n\r\nWhen working on this PR, I noticed a big existing problem that affects mixed-platform remoting. For example, if you run the TUI on a Linux box and remote into a Windows box, the TUI logic doesn't properly handle Windows sandbox setup properly. Fixing this is beyond the scope of this PR, but I've left a TODO comment in place so we don't forget.\r\n\r\n## What changed\r\n\r\n- Move the remaining TUI-specific sandbox level, setup, telemetry, and read-root helpers into `codex-tui`, calling `codex-windows-sandbox` directly.\r\n- Remove the Windows sandbox namespace and read-root grant re-exports from the client-side `legacy_core` facade.\r\n- Remove the dormant pre-elevation prompt fallback guarded by the permanently enabled `ELEVATED_SANDBOX_NUX_ENABLED` switch. The reachable elevated and non-elevated setup flows remain unchanged.\r\n", + "labels": [], + "merged_at": "2026-06-11T16:23:08Z", + "number": 27490, + "state": "merged", + "title": "Remove TUI legacy Windows sandbox dependency", + "url": "https://github.com/openai/codex/pull/27490" + }, + "repo": "openai/codex", + "schema": "github_change_bundle/v1" +} diff --git a/artifacts/github/bundles/openai-codex-pr-27646.json b/artifacts/github/bundles/openai-codex-pr-27646.json new file mode 100644 index 000000000..434e571ca --- /dev/null +++ b/artifacts/github/bundles/openai-codex-pr-27646.json @@ -0,0 +1,50 @@ +{ + "analysis_mode": "pr_first", + "commits": [ + { + "author": "jif-oai", + "committed_at": "2026-06-11T18:05:02Z", + "message": "feat: disable orchestrator skills for now", + "sha": "fef2bbfa4c23e6144afa8c2081ca4a44cca082dc", + "url": "https://github.com/openai/codex/commit/fef2bbfa4c23e6144afa8c2081ca4a44cca082dc" + } + ], + "default_branch": "main", + "docs_refs": [], + "examples_refs": [], + "extracted_flags": [ + "TODO", + "ORCHESTRATOR_SKILLS_ENABLED" + ], + "files": [ + { + "additions": 11, + "deletions": 5, + "patch_excerpt": "@@ -27,6 +27,9 @@ use crate::outgoing_message::OutgoingMessageSender;\n use crate::thread_state::ThreadListenerCommand;\n use crate::thread_state::ThreadStateManager;\n \n+// TODO(jif): Enable once /ps/mcp serves complete hosted skill packages.\n+const ORCHESTRATOR_SKILLS_ENABLED: bool = false;\n+\n pub(crate) struct ThreadExtensionDependencies {\n pub(crate) event_sink: Arc,\n pub(crate) auth_manager: Arc,\n@@ -73,13 +76,16 @@ where\n codex_mcp_extension::install(&mut builder);\n codex_web_search_extension::install(&mut builder, auth_manager.clone());\n codex_image_generation_extension::install(&mut builder, auth_manager);\n+ let mut skill_providers = codex_skills_extension::SkillProviders::new()\n+ .with_executor_provider(executor_skill_provider);\n+ if ORCHESTRATOR_SKILLS_ENABLED {\n+ skill_providers = skill_providers.with_or...", + "path": "codex-rs/app-server/src/extensions.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 0, + "patch_excerpt": "@@ -124,6 +124,7 @@ async fn mcp_resource_read_returns_resource_contents() -> Result<()> {\n }\n \n #[tokio::test(flavor = \"multi_thread\", worker_threads = 2)]\n+#[ignore = \"orchestrator skills are disabled until /ps/mcp serves complete skill packages\"]\n async fn orchestrator_skill_can_read_referenced_resource_without_an_executor() -> Result<()> {\n let responses_server = responses::start_mock_server().await;\n let (apps_server_url, apps_server_handle) = start_resource_apps_mcp_server().await?;", + "path": "codex-rs/app-server/tests/suite/v2/mcp_resource.rs", + "status": "modified" + } + ], + "linked_issues": [], + "notes": [ + "Built from GitHub pull-request, commits, files, and repo endpoints." + ], + "primary_pr": { + "body": "Temp disable orchestrator-only skills while waiting for the endpoint to be fixed", + "labels": [], + "merged_at": "2026-06-11T18:20:26Z", + "number": 27646, + "state": "merged", + "title": "feat: disable orchestrator skills for now", + "url": "https://github.com/openai/codex/pull/27646" + }, + "repo": "openai/codex", + "schema": "github_change_bundle/v1" +} diff --git a/artifacts/github/impact/openai-codex-pr-27420.json b/artifacts/github/impact/openai-codex-pr-27420.json new file mode 100644 index 000000000..a40b309a2 --- /dev/null +++ b/artifacts/github/impact/openai-codex-pr-27420.json @@ -0,0 +1,48 @@ +{ + "schema": "upstream_impact/v1", + "slug": "openai-codex-pr-27420", + "repo": "openai/codex", + "source_refs": { + "items": [ + { + "kind": "pull_request", + "title": "[codex] Propagate plugin app categories", + "url": "https://github.com/openai/codex/pull/27420", + "meta": "Merged 2026-06-11T17:34:41Z" + }, + { + "kind": "pull_request", + "title": "Source-backed Decodex upstream review", + "url": "https://github.com/openai/codex/pull/27420", + "meta": "artifacts/github/reviews/openai-codex-pr-27420.review.json" + } + ] + }, + "observed_change": "Codex app-server plugin read and install summaries now expose nullable app category metadata sourced from local `.app.json`, app metadata, branding, and remote app templates.", + "public_signal_decision": "publish", + "control_plane_impact": "candidate", + "publisher_angle": "practical_explainer", + "confidence": "confirmed", + "evidence": [ + "App-server protocol schemas and generated TypeScript types add nullable `category` to app and app-template summaries.", + "`AppInfo::category()` implements branding-first and metadata fallback category selection.", + "Plugin loader and manager code now carries app category metadata from `.app.json` into app summaries.", + "Plugin read/install tests cover category propagation from local manifests, app metadata, and remote templates.", + "The plugin-creator sample validator now allows optional non-empty `.app.json` `category` values." + ], + "candidate_followups": [ + "Adopt nullable app categories in Decodex plugin/app catalog views.", + "Keep category handling additive and null-safe for older or uncategorized apps.", + "Consider a later site signal if downstream Decodex UI consumes this field." + ], + "social_notes": [ + "Good practical-explainer candidate for plugin authors and app-picker consumers.", + "Mention that the protocol addition is nullable and additive.", + "Avoid implying a complete marketplace taxonomy launch." + ], + "caveats": [ + "The PR does not remove existing plugin app fields.", + "The category field may be null.", + "This is propagation and validation, not a full app-store taxonomy feature." + ] +} diff --git a/artifacts/github/impact/openai-codex-pr-27433.json b/artifacts/github/impact/openai-codex-pr-27433.json new file mode 100644 index 000000000..8237f718f --- /dev/null +++ b/artifacts/github/impact/openai-codex-pr-27433.json @@ -0,0 +1,46 @@ +{ + "schema": "upstream_impact/v1", + "slug": "openai-codex-pr-27433", + "repo": "openai/codex", + "source_refs": { + "items": [ + { + "kind": "pull_request", + "title": "[codex] remove EnvironmentPathRef", + "url": "https://github.com/openai/codex/pull/27433", + "meta": "Merged 2026-06-11T18:26:13Z" + }, + { + "kind": "pull_request", + "title": "Source-backed Decodex upstream review", + "url": "https://github.com/openai/codex/pull/27433", + "meta": "artifacts/github/reviews/openai-codex-pr-27433.review.json" + } + ] + }, + "observed_change": "Codex removed the exec-server `EnvironmentPathRef` wrapper and changed executor skill resource ids to store an environment id plus absolute path instead.", + "public_signal_decision": "defer", + "control_plane_impact": "compat_risk", + "publisher_angle": "none", + "confidence": "confirmed", + "evidence": [ + "`EnvironmentPathRef` and its exec-server re-export are removed.", + "Skill catalog resource ids now carry an explicit environment id plus absolute path through `EnvironmentSkillResource`.", + "Executor skill provider code passes `environment_id` rather than cloning a filesystem-bound path reference.", + "The removed executor filesystem authority test shows the old same-instance read behavior no longer defines the resource identity contract.", + "The PR body ties the change to static host-path encoding in `PathUri` and notes it is stacked on #27454." + ], + "candidate_followups": [ + "Audit Decodex PathUri and skill-resource handling for explicit environment-id semantics.", + "Avoid depending on `EnvironmentPathRef` in any Decodex-side compatibility shim.", + "Treat this as part of a stacked PathUri migration rather than a complete migration by itself." + ], + "social_notes": [ + "No standalone social candidate; the change is internal and stacked, with limited public reader value." + ], + "caveats": [ + "The PR is stacked on earlier PathUri work.", + "There is no direct CLI/TUI user-facing path in this PR alone.", + "The compatibility risk is mainly for code that consumed exec-server internals or modeled skill resources as filesystem-bound path objects." + ] +} diff --git a/artifacts/github/impact/openai-codex-pr-27490.json b/artifacts/github/impact/openai-codex-pr-27490.json new file mode 100644 index 000000000..fd20e0796 --- /dev/null +++ b/artifacts/github/impact/openai-codex-pr-27490.json @@ -0,0 +1,44 @@ +{ + "schema": "upstream_impact/v1", + "slug": "openai-codex-pr-27490", + "repo": "openai/codex", + "source_refs": { + "items": [ + { + "kind": "pull_request", + "title": "Remove TUI legacy Windows sandbox dependency", + "url": "https://github.com/openai/codex/pull/27490", + "meta": "Merged 2026-06-11T16:23:08Z" + }, + { + "kind": "pull_request", + "title": "Source-backed Decodex upstream review", + "url": "https://github.com/openai/codex/pull/27490", + "meta": "artifacts/github/reviews/openai-codex-pr-27490.review.json" + } + ] + }, + "observed_change": "Codex moved Windows sandbox helper logic out of the app-server-client legacy facade and into the TUI, removing legacy re-exports and dead prompt fallback code while preserving the reachable Windows setup flow.", + "public_signal_decision": "skip", + "control_plane_impact": "watch", + "publisher_angle": "none", + "confidence": "confirmed", + "evidence": [ + "The PR body describes the change as behavior-neutral refactoring of TUI Windows sandbox helpers.", + "The app-server-client legacy facade no longer re-exports Windows sandbox helpers.", + "The new TUI helper module documents a remaining mixed-platform remote Windows sandbox gap.", + "Reachable elevated and non-elevated setup flows are intended to remain unchanged." + ], + "candidate_followups": [ + "Watch for later upstream PRs moving Windows sandbox readiness, setup, and read-root grants into app-server RPCs.", + "Avoid claiming Decodex mixed-platform Windows sandbox support from this refactor." + ], + "social_notes": [ + "No standalone social candidate: the public value is mostly a caveat, not a new capability." + ], + "caveats": [ + "The PR is not a remote Windows sandbox fix.", + "The mixed-platform remote gap is explicitly out of scope.", + "The removed fallback was dormant behind a permanently enabled switch." + ] +} diff --git a/artifacts/github/impact/openai-codex-pr-27646.json b/artifacts/github/impact/openai-codex-pr-27646.json new file mode 100644 index 000000000..cbccd5da3 --- /dev/null +++ b/artifacts/github/impact/openai-codex-pr-27646.json @@ -0,0 +1,45 @@ +{ + "schema": "upstream_impact/v1", + "slug": "openai-codex-pr-27646", + "repo": "openai/codex", + "source_refs": { + "items": [ + { + "kind": "pull_request", + "title": "feat: disable orchestrator skills for now", + "url": "https://github.com/openai/codex/pull/27646", + "meta": "Merged 2026-06-11T18:20:26Z" + }, + { + "kind": "pull_request", + "title": "Source-backed Decodex upstream review", + "url": "https://github.com/openai/codex/pull/27646", + "meta": "artifacts/github/reviews/openai-codex-pr-27646.review.json" + } + ] + }, + "observed_change": "Codex temporarily disables app-server registration of the orchestrator skill provider while keeping executor-backed skills enabled.", + "public_signal_decision": "defer", + "control_plane_impact": "compat_risk", + "publisher_angle": "watch_note", + "confidence": "confirmed", + "evidence": [ + "The PR body says orchestrator-only skills are temporarily disabled while waiting for the endpoint to be fixed.", + "App-server extension setup keeps the executor skill provider but only adds the orchestrator provider behind `ORCHESTRATOR_SKILLS_ENABLED = false`.", + "The orchestrator skill resource test is ignored until `/ps/mcp` serves complete hosted skill packages." + ], + "candidate_followups": [ + "Gate Decodex hosted-skill assumptions on explicit app-server capability evidence.", + "Keep operator diagnostics clear when orchestrator-only skills are unavailable.", + "Watch for the upstream re-enable PR before treating hosted skill resources as restored." + ], + "social_notes": [ + "Potential watch-note candidate, but downstream Publisher should keep the temporary nature prominent.", + "Do not frame this as all skills being disabled; executor-backed skills remain registered." + ], + "caveats": [ + "Temporary upstream state, not a permanent API removal.", + "Executor-backed skill resources are still installed.", + "The blocker named by upstream is incomplete hosted skill packages from `/ps/mcp`." + ] +} diff --git a/artifacts/github/review-queue/openai-codex-latest.json b/artifacts/github/review-queue/openai-codex-latest.json index 364d0bb8e..23bc106e8 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": 17, - "high": 11, + "critical": 19, + "high": 10, "low": 0, - "normal": 12, + "normal": 11, "published_subjects_seen": 0, "recent_commits_scanned": 40, "subjects_queued": 40 }, - "generated_at": "2026-06-12T02:04:59.697624Z", + "generated_at": "2026-06-12T08:04:41.522499Z", "repo": "openai/codex", "schema": "upstream_review_queue/v1", "source": { @@ -17,161 +17,6 @@ "signals_dir": "site/src/content/signals" }, "subjects": [ - { - "attention_flags": [ - "auth_account", - "deprecated_removed", - "new_feature", - "protocol_change", - "security_policy" - ], - "changed_file_count": 8, - "commit_shas": [ - "c011f6e6809601b6cc138e055bf1bc57bf5b5d4c", - "571debf6883633a51c69f6654efd10c4e13e7f26", - "0b768f5016684ccf0266aef513ff7f7bdfcc5aa2" - ], - "committed_at": "2026-06-11T10:07:19Z", - "next_step": "ai_review_required", - "pr_number": 27573, - "pr_url": "https://github.com/openai/codex/pull/27573", - "review_priority": "critical", - "review_reason": "Needs AI review for auth_account, deprecated_removed, new_feature, protocol_change, security_policy.", - "sample_paths": [ - "codex-rs/app-server/tests/suite/v2/compaction.rs", - "codex-rs/core/tests/suite/compact.rs", - "codex-rs/core/tests/suite/compact_remote.rs", - "codex-rs/core/tests/suite/compact_remote_parity.rs", - "codex-rs/core/tests/suite/hooks.rs", - "codex-rs/core/tests/suite/responses_lite.rs", - "codex-rs/features/src/lib.rs", - "codex-rs/features/src/tests.rs" - ], - "source_state": "merged", - "subject_id": "27573", - "subject_kind": "pr", - "surface_hints": [ - "app_server_protocol", - "config_hooks", - "tests_ci" - ], - "title": "core: enable remote compaction v2 by default", - "url": "https://github.com/openai/codex/pull/27573" - }, - { - "attention_flags": [ - "deprecated_removed", - "new_feature", - "protocol_change", - "release_packaging" - ], - "changed_file_count": 6, - "commit_shas": [ - "168cddddc1b5c5f4fe64534acc4e31ae69474365", - "fe04e86efaae705d0b47e3d076e82d54b2e1dca5", - "92644c48f26b1f5d92892c01cd1585b86fc381f1", - "e13920ef12be52e892db5cbf3e0a3402d5d33f6e" - ], - "committed_at": "2026-06-11T10:41:44Z", - "next_step": "ai_review_required", - "pr_number": 27569, - "pr_url": "https://github.com/openai/codex/pull/27569", - "review_priority": "critical", - "review_reason": "Needs AI review for deprecated_removed, new_feature, protocol_change, release_packaging.", - "sample_paths": [ - "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/spec_plan.rs", - "codex-rs/core/src/tools/spec_plan_tests.rs" - ], - "source_state": "merged", - "subject_id": "27569", - "subject_kind": "pr", - "surface_hints": [ - "config_hooks", - "tests_ci" - ], - "title": "multi-agent: move concurrency guidance into v2 usage hints", - "url": "https://github.com/openai/codex/pull/27569" - }, - { - "attention_flags": [ - "auth_account", - "deprecated_removed", - "new_feature", - "protocol_change" - ], - "changed_file_count": 4, - "commit_shas": [ - "0dd59d361fb64e7cad0641619eae8047f893a8d8" - ], - "committed_at": "2026-06-11T11:51:04Z", - "next_step": "ai_review_required", - "pr_number": 27591, - "pr_url": "https://github.com/openai/codex/pull/27591", - "review_priority": "critical", - "review_reason": "Needs AI review for auth_account, deprecated_removed, new_feature, protocol_change.", - "sample_paths": [ - "codex-rs/app-server/tests/suite/v2/mcp_resource.rs", - "codex-rs/core-skills/src/render.rs", - "codex-rs/ext/skills/src/render.rs", - "codex-rs/ext/skills/tests/skills_extension.rs" - ], - "source_state": "merged", - "subject_id": "27591", - "subject_kind": "pr", - "surface_hints": [ - "app_server_protocol", - "mcp_plugins", - "tests_ci" - ], - "title": "skills: render catalog locators by authority", - "url": "https://github.com/openai/codex/pull/27591" - }, - { - "attention_flags": [ - "breaking_change", - "deprecated_removed", - "new_feature", - "protocol_change", - "release_packaging" - ], - "changed_file_count": 10, - "commit_shas": [ - "9ff580bf7e426f19713de20aaa9a0138a4aa389f", - "3eb9c5126d277d5c6e2b92dfb71a3025942a19ef" - ], - "committed_at": "2026-06-11T12:03:53Z", - "next_step": "ai_review_required", - "pr_number": 27413, - "pr_url": "https://github.com/openai/codex/pull/27413", - "review_priority": "critical", - "review_reason": "Needs AI review for breaking_change, deprecated_removed, new_feature, protocol_change, release_packaging.", - "sample_paths": [ - "codex-rs/Cargo.lock", - "codex-rs/app-server/src/extensions.rs", - "codex-rs/ext/skills/Cargo.toml", - "codex-rs/ext/skills/src/config.rs", - "codex-rs/ext/skills/src/extension.rs", - "codex-rs/ext/skills/src/fragments.rs", - "codex-rs/ext/skills/src/lib.rs", - "codex-rs/ext/skills/src/render.rs", - "codex-rs/ext/skills/src/state.rs", - "codex-rs/ext/skills/tests/skills_extension.rs" - ], - "source_state": "merged", - "subject_id": "27413", - "subject_kind": "pr", - "surface_hints": [ - "app_server_protocol", - "config_hooks", - "tests_ci" - ], - "title": "skills: decouple the skills extension from core", - "url": "https://github.com/openai/codex/pull/27413" - }, { "attention_flags": [ "auth_account", @@ -755,104 +600,308 @@ { "attention_flags": [ "auth_account", + "breaking_change", + "deprecated_removed", "new_feature", - "protocol_change" + "protocol_change", + "release_packaging", + "security_policy" + ], + "changed_file_count": 33, + "commit_shas": [ + "c1c83d3db1c92450ee5104637673da205c3b53f1", + "11b7a3193c9c0b607a89154d613bf31bf9968356", + "37c9a1af8e791b935a7e6b79412097349b3be23a", + "2ccf773428b3e45ea0bf628f7cdc1f829acb4ec6", + "89e994bf64ee35e3e03915cea760486b67eeeddb", + "f06ad42c1964a93de5e96576e7c4244ac41f2e74", + "751a2a5ffa1105ebf86c0c89507d97b1dd8a203e", + "5d46286a8c47f23d546e431d8395861091407ac3", + "51201c3539709dc098c33bb5d917c3f3c2c360d1", + "51c0ede50280cb2b7720ad4edc795b99f2bbff8b", + "5957b62fc0479ae8ab34b1126edbfc482536d7a1", + "38fa3a8ac4472cf91ae78a7bcf46de916d96849a", + "6d519c7361e8c5d9ea93acd5a9ee2bdf8b52d76e", + "ffc649de3e5b2fb406e8fc84b26973bf375762ab", + "d4c46df25f4a90a7cb75380379d58bb301bcb9af", + "e34ec2789518918e9cd1d8b06187ce1da043b5b5" + ], + "committed_at": "2026-06-12T04:28:52Z", + "next_step": "ai_review_required", + "pr_number": 27445, + "pr_url": "https://github.com/openai/codex/pull/27445", + "review_priority": "critical", + "review_reason": "Needs AI review for auth_account, breaking_change, deprecated_removed, new_feature, protocol_change, release_packaging, security_policy.", + "sample_paths": [ + "codex-rs/app-server-daemon/src/backend/pid.rs", + "codex-rs/app-server-daemon/src/backend/pid_tests.rs", + "codex-rs/app-server-daemon/src/lib.rs", + "codex-rs/app-server-daemon/src/remote_control_client.rs", + "codex-rs/app-server-protocol/schema/json/ClientRequest.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/typescript/v2/RemoteControlDisableParams.ts", + "codex-rs/app-server-protocol/schema/typescript/v2/RemoteControlEnableParams.ts", + "codex-rs/app-server-protocol/schema/typescript/v2/index.ts", + "codex-rs/app-server-protocol/src/protocol/common.rs", + "codex-rs/app-server-protocol/src/protocol/v2/remote_control.rs" + ], + "source_state": "merged", + "subject_id": "27445", + "subject_kind": "pr", + "surface_hints": [ + "app_server_protocol", + "cli_tui", + "docs_examples", + "tests_ci" + ], + "title": "feat(app-server): persist remote-control desired state", + "url": "https://github.com/openai/codex/pull/27445" + }, + { + "attention_flags": [ + "auth_account", + "deprecated_removed", + "new_feature", + "protocol_change", + "release_packaging", + "security_policy" + ], + "changed_file_count": 17, + "commit_shas": [ + "7fcf243caa6f8834c1d88fa7daddff28463424df", + "d4f8529190f9b4d4e9f527fd821038fa74332811", + "45674d25fca290b2193f147166e39231c6176072", + "bbc613c1dca65fa1b2c575eb83a2f90098a545cc", + "f2b7e7007a7077a2933627a690c3028b618cd2ff", + "e1d67f06b9abefe67d33231520aed075ed7731d7", + "a98925967179e545884a561f56321a4e905bd13a", + "62dbad3c1de1174856546c5cb62e798b18d2c58a", + "4075df843ae6e07aaba605a9c2139907f1160ab4", + "2cfb435d0e8a46aa536ece31817556832b344f82", + "71637bace336f2cad7f405e88a04841813767c8c", + "7d0addee9861574ed5f3dd7bc6e8b123ed9fed69", + "45e35b1147a70a06c3701933b636421ede421443", + "e2bae8628968b7f7e8e69d3117849c6397f64645", + "d68efcaa2e2bc4219129d4ad8589e7b34cb67270" + ], + "committed_at": "2026-06-12T05:26:31Z", + "next_step": "ai_review_required", + "pr_number": 27508, + "pr_url": "https://github.com/openai/codex/pull/27508", + "review_priority": "critical", + "review_reason": "Needs AI review for auth_account, deprecated_removed, new_feature, protocol_change, release_packaging, security_policy.", + "sample_paths": [ + "codex-rs/app-server-client/src/lib.rs", + "codex-rs/app-server-client/src/path.rs", + "codex-rs/app-server-client/src/remote.rs", + "codex-rs/tui/src/app/tests.rs", + "codex-rs/tui/src/app/thread_goal_actions.rs", + "codex-rs/tui/src/app_server_session.rs", + "codex-rs/tui/src/app_server_session/fs.rs", + "codex-rs/tui/src/bottom_pane/mod.rs", + "codex-rs/tui/src/chatwidget.rs", + "codex-rs/tui/src/chatwidget/goal_validation.rs", + "codex-rs/tui/src/chatwidget/slash_dispatch.rs", + "codex-rs/tui/src/chatwidget/tests.rs" + ], + "source_state": "merged", + "subject_id": "27508", + "subject_kind": "pr", + "surface_hints": [ + "app_server_protocol", + "cli_tui", + "tests_ci" + ], + "title": "[1 of 3] Support long raw TUI goal objectives", + "url": "https://github.com/openai/codex/pull/27508" + }, + { + "attention_flags": [ + "auth_account", + "breaking_change", + "new_feature", + "protocol_change", + "security_policy" ], - "changed_file_count": 12, + "changed_file_count": 25, "commit_shas": [ - "74066fb2c10e8e881f43faac5222e023527409d4", - "fbdff12dbc44263909c49bbd31cdd4fabc068153" + "1c776a78980457d4c7300b47af0b3565bf5218ce", + "a2a6c6f2e513d21dec6b385d0e386212a257b5f8", + "ba0f8c7bd1cdc11d3706b368a9071abc3caebd43" ], - "committed_at": "2026-06-11T10:38:04Z", + "committed_at": "2026-06-12T05:30:41Z", "next_step": "ai_review_required", - "pr_number": 27388, - "pr_url": "https://github.com/openai/codex/pull/27388", - "review_priority": "high", - "review_reason": "Needs AI review for auth_account, new_feature, protocol_change.", + "pr_number": 27256, + "pr_url": "https://github.com/openai/codex/pull/27256", + "review_priority": "critical", + "review_reason": "Needs AI review for auth_account, breaking_change, new_feature, protocol_change, security_policy.", "sample_paths": [ - "codex-rs/Cargo.lock", - "codex-rs/app-server/tests/suite/v2/mcp_resource.rs", - "codex-rs/ext/skills/Cargo.toml", - "codex-rs/ext/skills/src/extension.rs", - "codex-rs/ext/skills/src/lib.rs", - "codex-rs/ext/skills/src/provider/orchestrator.rs", - "codex-rs/ext/skills/src/sources.rs", - "codex-rs/ext/skills/src/tools/list.rs", - "codex-rs/ext/skills/src/tools/mod.rs", - "codex-rs/ext/skills/src/tools/read.rs", - "codex-rs/ext/skills/src/tools/schema.rs", - "codex-rs/tools/src/tool_output.rs" + "codex-rs/app-server-client/src/lib.rs", + "codex-rs/app-server-protocol/schema/json/ServerRequest.json", + "codex-rs/app-server-protocol/schema/json/ToolRequestUserInputParams.json", + "codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.schemas.json", + "codex-rs/app-server-protocol/schema/typescript/v2/ToolRequestUserInputParams.ts", + "codex-rs/app-server-protocol/src/protocol/v2/item.rs", + "codex-rs/app-server/src/bespoke_event_handling.rs", + "codex-rs/app-server/src/outgoing_message.rs", + "codex-rs/app-server/src/request_processors/thread_processor_tests.rs", + "codex-rs/app-server/tests/suite/v2/request_user_input.rs", + "codex-rs/core/src/codex_delegate.rs", + "codex-rs/core/src/codex_delegate_tests.rs" ], "source_state": "merged", - "subject_id": "27388", + "subject_id": "27256", "subject_kind": "pr", "surface_hints": [ "app_server_protocol", - "config_hooks", + "cli_tui", "mcp_plugins", - "model_provider", "tests_ci" ], - "title": "skills: expose remote skill resource tools", - "url": "https://github.com/openai/codex/pull/27388" + "title": "Add request_user_input auto-resolution window contract", + "url": "https://github.com/openai/codex/pull/27256" }, { "attention_flags": [ + "auth_account", + "deprecated_removed", "new_feature", - "protocol_change" + "protocol_change", + "release_packaging", + "security_policy" ], - "changed_file_count": 3, + "changed_file_count": 19, "commit_shas": [ - "fd1acbdba917067139984c12cb9c4288af38988a" + "b371fc20b8ff9939400ad984ffc899285ec08811", + "7f78a47e466d319886fe85ffbb49c5aa5fd4c705", + "79d913b81e08e954455b55b347568f8147cc0880" ], - "committed_at": "2026-06-11T10:52:46Z", + "committed_at": "2026-06-12T05:37:26Z", "next_step": "ai_review_required", - "pr_number": 27585, - "pr_url": "https://github.com/openai/codex/pull/27585", - "review_priority": "high", - "review_reason": "Needs AI review for new_feature, protocol_change.", + "pr_number": 27724, + "pr_url": "https://github.com/openai/codex/pull/27724", + "review_priority": "critical", + "review_reason": "Needs AI review for auth_account, deprecated_removed, new_feature, protocol_change, release_packaging, security_policy.", "sample_paths": [ "codex-rs/Cargo.lock", - "codex-rs/ext/skills/Cargo.toml", - "codex-rs/ext/skills/src/tools/read.rs" + "codex-rs/Cargo.toml", + "codex-rs/code-mode-host/BUILD.bazel", + "codex-rs/code-mode-host/Cargo.toml", + "codex-rs/code-mode-host/src/main.rs", + "codex-rs/code-mode-protocol/BUILD.bazel", + "codex-rs/code-mode-protocol/Cargo.toml", + "codex-rs/code-mode-protocol/src/description.rs", + "codex-rs/code-mode-protocol/src/lib.rs", + "codex-rs/code-mode-protocol/src/response.rs", + "codex-rs/code-mode-protocol/src/runtime.rs", + "codex-rs/code-mode-protocol/src/session.rs" ], "source_state": "merged", - "subject_id": "27585", + "subject_id": "27724", "subject_kind": "pr", "surface_hints": [ - "config_hooks" + "app_server_protocol", + "config_hooks", + "tests_ci" ], - "title": "nit: cap error", - "url": "https://github.com/openai/codex/pull/27585" + "title": "code-mode standalone: extract protocol and add host crate", + "url": "https://github.com/openai/codex/pull/27724" }, { "attention_flags": [ + "deprecated_removed", "new_feature", - "protocol_change" + "protocol_change", + "security_policy" ], - "changed_file_count": 1, + "changed_file_count": 4, "commit_shas": [ - "68dc3b758d207d708025a8cb2df6a9eede57d17f" + "763e8b940bc7d2f1469a25580295cf4c3bc71c85", + "f87021864074363a282c1937081588060ed8a1e7", + "b99bf9064e35c399d35860b720897ab266b26acc", + "e1ca683c9e5f52952bc13b4de8b55673e1baeb1c" ], - "committed_at": "2026-06-11T10:55:58Z", + "committed_at": "2026-06-12T06:23:44Z", "next_step": "ai_review_required", - "pr_number": 27404, - "pr_url": "https://github.com/openai/codex/pull/27404", - "review_priority": "high", - "review_reason": "Needs AI review for new_feature, protocol_change.", + "pr_number": 27316, + "pr_url": "https://github.com/openai/codex/pull/27316", + "review_priority": "critical", + "review_reason": "Needs AI review for deprecated_removed, new_feature, protocol_change, security_policy.", "sample_paths": [ - "codex-rs/app-server/tests/suite/v2/mcp_resource.rs" + "codex-rs/core/src/tools/spec_plan.rs", + "codex-rs/core/src/tools/spec_plan_tests.rs", + "codex-rs/core/tests/suite/code_mode.rs", + "codex-rs/core/tests/suite/model_runtime_selectors.rs" ], "source_state": "merged", - "subject_id": "27404", + "subject_id": "27316", "subject_kind": "pr", "surface_hints": [ - "app_server_protocol", - "mcp_plugins", + "model_provider", "tests_ci" ], - "title": "test: cover referenced backend skill reads without an executor", - "url": "https://github.com/openai/codex/pull/27404" + "title": "Keep request_user_input direct-model only", + "url": "https://github.com/openai/codex/pull/27316" + }, + { + "attention_flags": [ + "deprecated_removed", + "new_feature", + "protocol_change", + "release_packaging", + "security_policy" + ], + "changed_file_count": 15, + "commit_shas": [ + "bf7e046ef92cb66b11b5faad365f8fedf520e9a2", + "e4108a61e2c2202a3a023096d72e4b074eeea3f6", + "983e59bc4856168134a51bd61995848e0658e8a2", + "7349490148f4733f12d8a697cd0ca707125465ca", + "1d0be482e805f3da625b0463d497284658fbc1d1", + "a1acbe077be0ae8fb76ff52b597130bcc12fd15c", + "0cf644af40f76ffdfbac134b4b17aca78e8dcef5", + "bccf6b711e49e37f8bf1206853220c35f57b791a", + "385ae2e47da93cacbac76716b2a7338f96bb2353", + "22167d0053fc4a0446c9936e43efd042a0747e97", + "04393ff90d514aaf44ff0cf78454a1e2bbd05c94", + "6fdb655aab0160caa3d3144532f1ad65dc8deaec", + "6f9903d25d05b2ec36edff1084deb4766452d219", + "ba1b107d83e3d545436341b2451edb70fbeb096e", + "a4eb618a780b20e6d9ee2dd61cf880fe26019c4d", + "7d151cc5f3374795198fdcdabcde795e36e737d6", + "509459c428b5c3cf3ddffa281439330d2c71c0ce" + ], + "committed_at": "2026-06-12T07:10:06Z", + "next_step": "ai_review_required", + "pr_number": 27696, + "pr_url": "https://github.com/openai/codex/pull/27696", + "review_priority": "critical", + "review_reason": "Needs AI review for deprecated_removed, new_feature, protocol_change, release_packaging, security_policy.", + "sample_paths": [ + "codex-rs/core/src/agents_md.rs", + "codex-rs/core/src/agents_md_tests.rs", + "codex-rs/core/src/context/contextual_user_message_tests.rs", + "codex-rs/core/src/context/user_instructions.rs", + "codex-rs/core/src/environment_selection.rs", + "codex-rs/core/src/session/mod.rs", + "codex-rs/core/src/session/turn_context.rs", + "codex-rs/core/src/thread_manager_tests.rs", + "codex-rs/core/tests/common/context_snapshot.rs", + "codex-rs/core/tests/suite/agents_md.rs", + "codex-rs/core/tests/suite/client.rs", + "codex-rs/core/tests/suite/compact.rs" + ], + "source_state": "merged", + "subject_id": "27696", + "subject_kind": "pr", + "surface_hints": [ + "cli_tui", + "model_provider", + "tests_ci" + ], + "title": "[codex] Load AGENTS.md from all bound environments", + "url": "https://github.com/openai/codex/pull/27696" }, { "attention_flags": [ @@ -1106,60 +1155,68 @@ }, { "attention_flags": [ - "protocol_change", "release_packaging" ], "changed_file_count": 1, "commit_shas": [ - "4f766def20881fa0e6644384dd7336568f704c6d" + "6cdfc74097433136f37f4969f16f22374e4f1fc0" ], - "committed_at": "2026-06-11T14:19:27Z", + "committed_at": "2026-06-12T02:44:36Z", "next_step": "ai_review_required", - "pr_number": 27527, - "pr_url": "https://github.com/openai/codex/pull/27527", - "review_priority": "normal", - "review_reason": "Needs AI review for protocol_change, release_packaging.", + "pr_number": 27702, + "pr_url": "https://github.com/openai/codex/pull/27702", + "review_priority": "high", + "review_reason": "Needs AI review for release_packaging.", "sample_paths": [ - ".github/workflows/rust-release.yml" + "codex-rs/Cargo.toml" ], "source_state": "merged", - "subject_id": "27527", + "subject_id": "27702", "subject_kind": "pr", "surface_hints": [ - "release_packaging", - "tests_ci" + "config_hooks" ], - "title": "[codex] publish npm packages concurrently", - "url": "https://github.com/openai/codex/pull/27527" + "title": "[codex] parallelize release code generation", + "url": "https://github.com/openai/codex/pull/27702" }, { "attention_flags": [ - "auth_account", - "release_packaging", + "new_feature", + "protocol_change", "security_policy" ], - "changed_file_count": 1, + "changed_file_count": 11, "commit_shas": [ - "c07c75ef754355a134c712b18dc470c0e21ce636" + "f285bd830523f2b3c05c0214a2eeb1f93baa330f" ], - "committed_at": "2026-06-11T14:23:46Z", + "committed_at": "2026-06-12T03:35:28Z", "next_step": "ai_review_required", - "pr_number": 27528, - "pr_url": "https://github.com/openai/codex/pull/27528", - "review_priority": "normal", - "review_reason": "Needs AI review for auth_account, release_packaging, security_policy.", + "pr_number": 27709, + "pr_url": "https://github.com/openai/codex/pull/27709", + "review_priority": "high", + "review_reason": "Needs AI review for new_feature, protocol_change, security_policy.", "sample_paths": [ - ".github/workflows/rust-release.yml" + "codex-rs/app-server/src/request_processors/request_errors.rs", + "codex-rs/app-server/src/request_processors/thread_processor.rs", + "codex-rs/app-server/src/request_processors/turn_processor.rs", + "codex-rs/core/src/context/environment_context.rs", + "codex-rs/core/src/environment_selection.rs", + "codex-rs/core/src/session/session.rs", + "codex-rs/core/src/session/tests.rs", + "codex-rs/core/src/session/turn_context.rs", + "codex-rs/core/src/shell.rs", + "codex-rs/core/src/thread_manager.rs", + "codex-rs/core/tests/suite/remote_env.rs" ], "source_state": "merged", - "subject_id": "27528", + "subject_id": "27709", "subject_kind": "pr", "surface_hints": [ - "release_packaging", + "app_server_protocol", "tests_ci" ], - "title": "[codex] publish DotSlash alongside npm", - "url": "https://github.com/openai/codex/pull/27528" + "title": "[codex] resolve environment shell metadata eagerly", + "url": "https://github.com/openai/codex/pull/27709" }, { "attention_flags": [ @@ -1478,6 +1535,34 @@ ], "title": "ci(v8): gate Windows source builds on relevant changes", "url": "https://github.com/openai/codex/pull/27715" + }, + { + "attention_flags": [ + "new_feature", + "protocol_change", + "security_policy" + ], + "changed_file_count": 1, + "commit_shas": [ + "09d45b408a88670c30b2fd03a3c81d6d6456b436" + ], + "committed_at": "2026-06-12T06:20:36Z", + "next_step": "ai_review_required", + "pr_number": 27778, + "pr_url": "https://github.com/openai/codex/pull/27778", + "review_priority": "normal", + "review_reason": "Needs AI review for new_feature, protocol_change, security_policy.", + "sample_paths": [ + ".github/workflows/issue-translator.yml" + ], + "source_state": "merged", + "subject_id": "27778", + "subject_kind": "pr", + "surface_hints": [ + "tests_ci" + ], + "title": "Translate non-English issues", + "url": "https://github.com/openai/codex/pull/27778" } ] } diff --git a/artifacts/github/reviews/openai-codex-pr-27420.review.json b/artifacts/github/reviews/openai-codex-pr-27420.review.json new file mode 100644 index 000000000..8a1bcb0cf --- /dev/null +++ b/artifacts/github/reviews/openai-codex-pr-27420.review.json @@ -0,0 +1,64 @@ +{ + "schema": "upstream_review/v1", + "slug": "openai-codex-pr-27420", + "repo": "openai/codex", + "subject": { + "subject_kind": "pr", + "subject_id": "27420", + "commit_shas": [ + "2f6191ea633cd0a58580c484cc37d88191787385" + ] + }, + "source_refs": { + "items": [ + { + "kind": "pull_request", + "title": "[codex] Propagate plugin app categories", + "url": "https://github.com/openai/codex/pull/27420", + "meta": "Merged 2026-06-11T17:34:41Z" + }, + { + "kind": "commit", + "title": "Propagate plugin app categories", + "url": "https://github.com/openai/codex/commit/2f6191ea633cd0a58580c484cc37d88191787385" + } + ] + }, + "reviewed_at": "2026-06-12T08:06:51Z", + "observed_change": "Codex app-server plugin read and install summaries now expose nullable app category metadata sourced from local `.app.json`, app metadata, branding, and remote app templates.", + "changed_surfaces": [ + "app-server protocol v2 schema and generated TypeScript types", + "plugin app manifest validation", + "core plugin loader and manager metadata", + "plugin read/install request processors", + "app-server plugin read/install tests" + ], + "user_visible_path": "Plugin details UI and app-server clients can show a normalized per-app category on `AppSummary` and `AppTemplateSummary` responses instead of inferring category only from raw metadata.", + "control_plane_relevance": "High for Decodex Control Plane plugin and app catalog surfaces because app category is now a protocol-visible field that can drive grouping, filtering, or display without parsing provider-specific metadata.", + "compatibility_risk": "Low because the field is additive and nullable, but generated TypeScript protocol types and strict app-server clients must accept the new `category` property on app and template summaries.", + "adoption_opportunity": "Use the nullable category field in Decodex plugin/app UI and preserve `null` when no branding, metadata, or template category is available.", + "community_value": "High for plugin authors and Codex app users because `.app.json` can now carry a category override and plugin/app pickers can present clearer app groupings.", + "deprecated_or_breaking_notes": "No existing field is removed. `.app.json` now accepts optional non-empty `category`; empty or non-string categories remain invalid.", + "confidence": "confirmed", + "evidence": [ + "PR #27420 says the plugin details UI needs a normalized per-app category and lists `.app.json`, protocol summaries, fallback metadata, and regenerated fixtures as the intended changes.", + "`codex-rs/app-server-protocol/src/protocol/v2/apps.rs` adds `AppInfo::category()` with branding-first and app-metadata fallback logic.", + "`codex-rs/app-server-protocol/src/protocol/v2/plugin.rs` adds `category: Option` to `AppTemplateSummary`, and generated JSON/TypeScript schema files add nullable `category` fields.", + "`codex-rs/core-plugins/src/loader.rs` adds `PluginAppMetadata` and parses optional `.app.json` `category` values.", + "`codex-rs/core-plugins/src/manager.rs` stores `app_category_by_id`, and `codex-rs/app-server/src/request_processors/plugins.rs` passes category maps into app summary construction.", + "`codex-rs/app-server/tests/suite/v2/plugin_read.rs` and `plugin_install.rs` add coverage for local app manifest categories, metadata fallback, and remote template category propagation.", + "`codex-rs/skills/src/assets/samples/plugin-creator/scripts/validate_plugin.py` allows `category` in `.app.json` and rejects empty or non-string values.", + "The normalized bundle `artifacts/github/bundles/openai-codex-pr-27420.json` records 16 changed files for the merged PR." + ], + "caveats": "Do not claim broad plugin marketplace taxonomy behavior from this PR alone; it adds per-app category propagation and validation surfaces.", + "next_actions": [ + { + "type": "upstream_impact", + "reason": "Plugin app category propagation affects Decodex app catalog and protocol consumers." + }, + { + "type": "social_candidate", + "reason": "The additive protocol field is useful public guidance for plugin app authors and app-picker consumers." + } + ] +} diff --git a/artifacts/github/reviews/openai-codex-pr-27433.review.json b/artifacts/github/reviews/openai-codex-pr-27433.review.json new file mode 100644 index 000000000..3c5276c91 --- /dev/null +++ b/artifacts/github/reviews/openai-codex-pr-27433.review.json @@ -0,0 +1,57 @@ +{ + "schema": "upstream_review/v1", + "slug": "openai-codex-pr-27433", + "repo": "openai/codex", + "subject": { + "subject_kind": "pr", + "subject_id": "27433", + "commit_shas": [ + "a8e9807f4a94cf84b288c0c9ce2678788c9d3228" + ] + }, + "source_refs": { + "items": [ + { + "kind": "pull_request", + "title": "[codex] remove EnvironmentPathRef", + "url": "https://github.com/openai/codex/pull/27433", + "meta": "Merged 2026-06-11T18:26:13Z" + }, + { + "kind": "commit", + "title": "Remove EnvironmentPathRef", + "url": "https://github.com/openai/codex/commit/a8e9807f4a94cf84b288c0c9ce2678788c9d3228" + } + ] + }, + "reviewed_at": "2026-06-12T08:06:51Z", + "observed_change": "Codex removed the exec-server `EnvironmentPathRef` wrapper and changed executor skill resource ids to store an environment id plus absolute path instead.", + "changed_surfaces": [ + "exec-server public Rust API", + "skills catalog resource identity", + "executor skill provider resource reads", + "executor filesystem authority tests" + ], + "user_visible_path": "There is no direct CLI/TUI user path in this PR alone; it supports the broader PathUri migration by making executor skill resources carry explicit environment identity and path data rather than a filesystem-bound path wrapper.", + "control_plane_relevance": "High for Decodex Control Plane internals that reason about environment-bound resources, PathUri migration, or hosted skill reads. The PR reduces reliance on path objects carrying a filesystem handle.", + "compatibility_risk": "Medium for downstream code using `codex_exec_server::EnvironmentPathRef` or assuming skill resource ids contain a bound executor filesystem object. Wire-level user behavior is not directly changed by this PR alone.", + "adoption_opportunity": "Audit Decodex PathUri and skill-resource handling for explicit environment id plus path semantics instead of object identity carried by `EnvironmentPathRef`.", + "community_value": "Low as a standalone public item because it is internal plumbing stacked on prior PathUri work, but it matters for operators tracking environment-resource authority changes.", + "deprecated_or_breaking_notes": "`codex-rs/exec-server/src/environment_path.rs` and the `EnvironmentPathRef` re-export are removed. The PR body says this is stacked on #27454 and switches to static host-path encoding in `PathUri`.", + "confidence": "confirmed", + "evidence": [ + "PR #27433 says Codex is switching to static host-path encoding in `PathUri` and removing `EnvironmentPathRef` for now.", + "`codex-rs/exec-server/src/environment_path.rs` is deleted and `codex-rs/exec-server/src/lib.rs` stops re-exporting `EnvironmentPathRef`.", + "`codex-rs/ext/skills/src/catalog.rs` replaces the optional `EnvironmentPathRef` inside `SkillResourceId` with an `EnvironmentSkillResource` value built from environment id and absolute path.", + "`codex-rs/ext/skills/src/provider/executor.rs` passes `environment_id` into resource id construction instead of cloning a filesystem-bound path reference.", + "`codex-rs/ext/skills/tests/executor_file_system_authority.rs` removes the test that depended on reading through the same environment filesystem instance used for listing.", + "The normalized bundle `artifacts/github/bundles/openai-codex-pr-27433.json` records 5 changed files for the merged PR." + ], + "caveats": "This PR is stacked on earlier PathUri work, so do not describe the full PathUri migration as completed by #27433 alone.", + "next_actions": [ + { + "type": "upstream_impact", + "reason": "Environment-bound skill resource identity changes are relevant to Decodex Control Plane compatibility tracking." + } + ] +} diff --git a/artifacts/github/reviews/openai-codex-pr-27490.review.json b/artifacts/github/reviews/openai-codex-pr-27490.review.json new file mode 100644 index 000000000..a53531392 --- /dev/null +++ b/artifacts/github/reviews/openai-codex-pr-27490.review.json @@ -0,0 +1,63 @@ +{ + "schema": "upstream_review/v1", + "slug": "openai-codex-pr-27490", + "repo": "openai/codex", + "subject": { + "subject_kind": "pr", + "subject_id": "27490", + "commit_shas": [ + "69b921aa666b1059422309b6ab7f4cd1a03b65c9", + "44494bb402287988f3faf7590d0ea284ae234657" + ] + }, + "source_refs": { + "items": [ + { + "kind": "pull_request", + "title": "Remove TUI legacy Windows sandbox dependency", + "url": "https://github.com/openai/codex/pull/27490", + "meta": "Merged 2026-06-11T16:23:08Z" + }, + { + "kind": "commit", + "title": "tui: remove legacy core Windows sandbox facade", + "url": "https://github.com/openai/codex/commit/69b921aa666b1059422309b6ab7f4cd1a03b65c9" + }, + { + "kind": "commit", + "title": "tui: document remote Windows sandbox gap", + "url": "https://github.com/openai/codex/commit/44494bb402287988f3faf7590d0ea284ae234657" + } + ] + }, + "reviewed_at": "2026-06-12T08:06:51Z", + "observed_change": "Codex moved Windows sandbox helper logic out of the app-server-client legacy facade and into the TUI, removing legacy re-exports and dead prompt fallback code while preserving the reachable Windows setup flow.", + "changed_surfaces": [ + "app-server-client legacy_core facade", + "TUI Windows sandbox helper module", + "TUI sandbox prompts, settings, onboarding, and telemetry call sites", + "remote Windows sandbox TODO documentation" + ], + "user_visible_path": "Windows TUI users should see the same reachable elevated and non-elevated sandbox setup paths; the PR explicitly documents that mixed-platform remoting, such as a Linux TUI controlling a Windows server, still has a sandbox setup gap.", + "control_plane_relevance": "Low to watch for Decodex Control Plane because this PR does not change app-server protocol, but it confirms Windows sandbox readiness/setup is still partly client-local and not safe to assume for mixed-platform remote operation.", + "compatibility_risk": "Low for current Decodex integrations unless they depended on the removed `legacy_core` Windows sandbox re-exports or assumed the TUI already handles remote Windows sandbox setup.", + "adoption_opportunity": "Track later upstream movement of Windows sandbox readiness, setup, and read-root grants into app-server `windowsSandbox/*` RPCs before claiming mixed-platform remote Windows support.", + "community_value": "Low public value as a standalone post because the PR is mostly behavior-neutral refactoring, with the useful caveat being the documented remote Windows sandbox limitation.", + "deprecated_or_breaking_notes": "The `legacy_core::windows_sandbox` namespace and `grant_read_root_non_elevated` re-export were removed from the app-server client facade. The dormant pre-elevation prompt fallback behind the permanently enabled switch was removed, but the PR body says reachable setup flows are unchanged.", + "confidence": "confirmed", + "evidence": [ + "PR #27490 says the change removes TUI Windows sandbox symbols from the legacy core facade and is intended to be behavior-neutral.", + "`codex-rs/app-server-client/src/lib.rs` removes the Windows sandbox namespace and `grant_read_root_non_elevated` re-export from `legacy_core`.", + "`codex-rs/tui/src/windows_sandbox.rs` adds TUI-owned helpers and a TODO explaining that readiness/setup still inspect the TUI host and do not support cross-platform remote app servers.", + "TUI call sites now call `crate::windows_sandbox::level_from_config` and `crate::windows_sandbox::sandbox_setup_is_complete` instead of the legacy core re-export.", + "`codex-rs/tui/src/chatwidget/windows_sandbox_prompts.rs` removes the dormant non-elevated setup fallback while keeping the elevated setup requirement path.", + "The normalized bundle `artifacts/github/bundles/openai-codex-pr-27490.json` records 13 changed files for the merged PR." + ], + "caveats": "Do not frame this as a Windows sandbox feature launch or a remote Windows fix; the PR explicitly leaves mixed-platform remote Windows sandbox setup out of scope.", + "next_actions": [ + { + "type": "upstream_impact", + "reason": "The remote Windows sandbox caveat is relevant to Control Plane compatibility tracking even though the PR is mostly behavior-neutral refactoring." + } + ] +} diff --git a/artifacts/github/reviews/openai-codex-pr-27646.review.json b/artifacts/github/reviews/openai-codex-pr-27646.review.json new file mode 100644 index 000000000..8d7c99d9f --- /dev/null +++ b/artifacts/github/reviews/openai-codex-pr-27646.review.json @@ -0,0 +1,58 @@ +{ + "schema": "upstream_review/v1", + "slug": "openai-codex-pr-27646", + "repo": "openai/codex", + "subject": { + "subject_kind": "pr", + "subject_id": "27646", + "commit_shas": [ + "fef2bbfa4c23e6144afa8c2081ca4a44cca082dc" + ] + }, + "source_refs": { + "items": [ + { + "kind": "pull_request", + "title": "feat: disable orchestrator skills for now", + "url": "https://github.com/openai/codex/pull/27646", + "meta": "Merged 2026-06-11T18:20:26Z" + }, + { + "kind": "commit", + "title": "feat: disable orchestrator skills for now", + "url": "https://github.com/openai/codex/commit/fef2bbfa4c23e6144afa8c2081ca4a44cca082dc" + } + ] + }, + "reviewed_at": "2026-06-12T08:06:51Z", + "observed_change": "Codex temporarily disables app-server registration of the orchestrator skill provider while keeping executor-backed skills enabled.", + "changed_surfaces": [ + "app-server extension provider registration", + "orchestrator skill MCP resource test coverage" + ], + "user_visible_path": "Users relying on hosted or orchestrator-only skills should not expect those skills to be available through app-server skill listing/reading until the upstream `/ps/mcp` package endpoint is complete; executor-environment skills still register.", + "control_plane_relevance": "High for Decodex Control Plane because hosted skill resources are a runtime capability boundary and Decodex prompts or tests must not assume orchestrator skills are currently exposed.", + "compatibility_risk": "High for flows that require orchestrator-owned `skill://` skills through app-server. Local host skills and executor-backed environment skills are not disabled by this PR.", + "adoption_opportunity": "Gate Decodex hosted-skill expectations on explicit app-server capability evidence and preserve fallback or unsupported-state messaging while orchestrator skills are disabled upstream.", + "community_value": "Medium as a cautious watch note for operators debugging why orchestrator-only skills are absent; the temporary nature makes it weaker than a feature announcement.", + "deprecated_or_breaking_notes": "This is a temporary disablement, not a schema removal. The PR adds an `ORCHESTRATOR_SKILLS_ENABLED: false` constant and ignores the orchestrator resource read test until `/ps/mcp` serves complete hosted skill packages.", + "confidence": "confirmed", + "evidence": [ + "PR #27646 body says orchestrator-only skills are temporarily disabled while waiting for the endpoint to be fixed.", + "`codex-rs/app-server/src/extensions.rs` adds `ORCHESTRATOR_SKILLS_ENABLED: bool = false` with a TODO to enable it once `/ps/mcp` serves complete hosted skill packages.", + "The same extension setup always starts `SkillProviders::new().with_executor_provider(executor_skill_provider)` and only adds `with_orchestrator_provider(...)` behind the disabled constant.", + "`codex-rs/app-server/tests/suite/v2/mcp_resource.rs` marks `orchestrator_skill_can_read_referenced_resource_without_an_executor` as ignored with the same hosted-package reason.", + "The normalized bundle `artifacts/github/bundles/openai-codex-pr-27646.json` records 2 changed files for the merged PR." + ], + "caveats": "Do not generalize this to all skill support. The disablement is specific to orchestrator-only skills in app-server, and the PR preserves executor-backed skill registration.", + "next_actions": [ + { + "type": "upstream_impact", + "reason": "Temporary hosted-skill disablement is a Control Plane compatibility risk." + }, + { + "type": "social_candidate", + "reason": "A cautious watch-note candidate can help operators understand absent orchestrator-only skills without treating the temporary state as permanent." + } + ] +} diff --git a/artifacts/github/social-candidates/openai-codex-pr-27420.json b/artifacts/github/social-candidates/openai-codex-pr-27420.json new file mode 100644 index 000000000..f83a6b235 --- /dev/null +++ b/artifacts/github/social-candidates/openai-codex-pr-27420.json @@ -0,0 +1,53 @@ +{ + "schema": "social_candidate/v1", + "slug": "openai-codex-pr-27420", + "repo": "openai/codex", + "channel": "x", + "target_account": "decodexspace", + "mode": "practical_explainer", + "priority": "critical", + "audience": "Codex plugin authors and app-picker implementers", + "candidate_text": [ + "Codex plugin app summaries now include `category`: `.app.json` can override it, remote templates can pass it through, and `AppSummary`/`AppTemplateSummary` expose nullable `category`. PR: https://github.com/openai/codex/pull/27420" + ], + "source_refs": { + "upstream_reviews": [ + "artifacts/github/reviews/openai-codex-pr-27420.review.json" + ], + "upstream_impacts": [ + "artifacts/github/impact/openai-codex-pr-27420.json" + ], + "urls": [ + "https://github.com/openai/codex/pull/27420" + ] + }, + "evidence_notes": [ + "App-server protocol schemas and generated TypeScript types add nullable `category` to app and template summaries.", + "Local `.app.json` can provide a category override, and app metadata can provide fallback categories.", + "Plugin read/install tests cover local, metadata, and remote-template category propagation." + ], + "claims": [ + { + "text": "Codex app-server plugin app summaries now expose nullable app category metadata.", + "evidence": "artifacts/github/reviews/openai-codex-pr-27420.review.json", + "confidence": "confirmed" + }, + { + "text": "Plugin authors can use optional `.app.json` `category` values when they are non-empty strings.", + "evidence": "artifacts/github/impact/openai-codex-pr-27420.json", + "confidence": "confirmed" + } + ], + "decision": { + "worthiness": "publish", + "reason": "The additive category field is practical, source-backed guidance for plugin app authors and UI consumers.", + "idempotency_key": "x:decodexspace:openai-codex-pr-27420:practical_explainer" + }, + "caveats": [ + "Do not frame this as a full marketplace taxonomy feature.", + "The field is nullable and additive." + ], + "next_steps": [ + "Let Publisher automation decide whether to reserve or publish this candidate." + ] +} diff --git a/artifacts/github/social-candidates/openai-codex-pr-27646.json b/artifacts/github/social-candidates/openai-codex-pr-27646.json new file mode 100644 index 000000000..5676eb353 --- /dev/null +++ b/artifacts/github/social-candidates/openai-codex-pr-27646.json @@ -0,0 +1,55 @@ +{ + "schema": "social_candidate/v1", + "slug": "openai-codex-pr-27646", + "repo": "openai/codex", + "channel": "x", + "target_account": "decodexspace", + "mode": "watch_note", + "priority": "critical", + "audience": "Codex operators using hosted or orchestrator-provided skills", + "candidate_text": [ + "Codex temporarily disabled orchestrator-only skills in app-server while `/ps/mcp` packages are incomplete. Executor-backed skills still register, but hosted/orchestrator `skill://` reads need a caveat. PR: https://github.com/openai/codex/pull/27646" + ], + "source_refs": { + "upstream_reviews": [ + "artifacts/github/reviews/openai-codex-pr-27646.review.json" + ], + "upstream_impacts": [ + "artifacts/github/impact/openai-codex-pr-27646.json" + ], + "urls": [ + "https://github.com/openai/codex/pull/27646" + ] + }, + "evidence_notes": [ + "`ORCHESTRATOR_SKILLS_ENABLED` is set to false in app-server extension registration.", + "Executor-backed skill provider registration remains present.", + "The orchestrator skill resource test is ignored until `/ps/mcp` serves complete hosted skill packages." + ], + "claims": [ + { + "text": "Codex app-server temporarily disables orchestrator-only skills.", + "evidence": "artifacts/github/reviews/openai-codex-pr-27646.review.json", + "confidence": "confirmed" + }, + { + "text": "Executor-backed skills are still registered by the app-server extension setup.", + "evidence": "artifacts/github/impact/openai-codex-pr-27646.json", + "confidence": "confirmed" + } + ], + "decision": { + "worthiness": "defer", + "reason": "The change is useful for operator awareness, but it is temporary and endpoint-dependent, so downstream Publisher should decide whether a watch note is worth posting.", + "idempotency_key": "x:decodexspace:openai-codex-pr-27646:watch_note" + }, + "caveats": [ + "Do not claim all skills are disabled.", + "Do not treat the temporary disablement as a permanent removal.", + "Hosted skill availability depends on future `/ps/mcp` package support." + ], + "next_steps": [ + "Let Publisher automation evaluate whether a deferred watch note is useful.", + "Watch upstream for the re-enable PR." + ] +} From bef3e387ecff3163c160dec771d17ac8c1faff55 Mon Sep 17 00:00:00 2001 From: Yvette Carlisle Date: Sat, 13 Jun 2026 10:15:38 +0800 Subject: [PATCH 2/2] {"schema":"decodex/commit/1","summary":"Persist upstream Radar review artifacts","authority":"manual"} --- .../github/bundles/openai-codex-pr-27720.json | 255 +++ .../github/bundles/openai-codex-pr-27816.json | 349 ++++ .../github/bundles/openai-codex-pr-27890.json | 131 ++ .../github/bundles/openai-codex-pr-27927.json | 119 ++ .../github/impact/openai-codex-pr-27720.json | 47 + .../github/impact/openai-codex-pr-27816.json | 47 + .../github/impact/openai-codex-pr-27890.json | 47 + .../github/impact/openai-codex-pr-27927.json | 45 + .../review-queue/openai-codex-latest.json | 1768 ++++++++--------- .../reviews/openai-codex-pr-27720.review.json | 76 + .../reviews/openai-codex-pr-27816.review.json | 65 + .../reviews/openai-codex-pr-27890.review.json | 64 + .../reviews/openai-codex-pr-27927.review.json | 59 + .../openai-codex-pr-27720.json | 53 + .../openai-codex-pr-27816.json | 53 + .../openai-codex-pr-27890.json | 53 + 16 files changed, 2314 insertions(+), 917 deletions(-) create mode 100644 artifacts/github/bundles/openai-codex-pr-27720.json create mode 100644 artifacts/github/bundles/openai-codex-pr-27816.json create mode 100644 artifacts/github/bundles/openai-codex-pr-27890.json create mode 100644 artifacts/github/bundles/openai-codex-pr-27927.json create mode 100644 artifacts/github/impact/openai-codex-pr-27720.json create mode 100644 artifacts/github/impact/openai-codex-pr-27816.json create mode 100644 artifacts/github/impact/openai-codex-pr-27890.json create mode 100644 artifacts/github/impact/openai-codex-pr-27927.json create mode 100644 artifacts/github/reviews/openai-codex-pr-27720.review.json create mode 100644 artifacts/github/reviews/openai-codex-pr-27816.review.json create mode 100644 artifacts/github/reviews/openai-codex-pr-27890.review.json create mode 100644 artifacts/github/reviews/openai-codex-pr-27927.review.json create mode 100644 artifacts/github/social-candidates/openai-codex-pr-27720.json create mode 100644 artifacts/github/social-candidates/openai-codex-pr-27816.json create mode 100644 artifacts/github/social-candidates/openai-codex-pr-27890.json diff --git a/artifacts/github/bundles/openai-codex-pr-27720.json b/artifacts/github/bundles/openai-codex-pr-27720.json new file mode 100644 index 000000000..f01fdee0a --- /dev/null +++ b/artifacts/github/bundles/openai-codex-pr-27720.json @@ -0,0 +1,255 @@ +{ + "analysis_mode": "pr_first", + "commits": [ + { + "author": "bakks", + "committed_at": "2026-06-12T00:20:45Z", + "message": "realtime: add AVAS architecture override", + "sha": "37efa545e8004b930a496c91c10ccc860937c29d", + "url": "https://github.com/openai/codex/commit/37efa545e8004b930a496c91c10ccc860937c29d" + }, + { + "author": "bakks", + "committed_at": "2026-06-12T00:31:58Z", + "message": "realtime: cover AVAS sideband auth", + "sha": "efd9be5adb25da27764e9e5a2221d14356ce7838", + "url": "https://github.com/openai/codex/commit/efd9be5adb25da27764e9e5a2221d14356ce7838" + }, + { + "author": "bakks", + "committed_at": "2026-06-12T01:46:00Z", + "message": "realtime: support local AVAS call endpoints", + "sha": "44dee73a25a44376823a6c3015779f6c476d47af", + "url": "https://github.com/openai/codex/commit/44dee73a25a44376823a6c3015779f6c476d47af" + }, + { + "author": "bakks", + "committed_at": "2026-06-12T05:25:31Z", + "message": "realtime: drop WebRTC call path override", + "sha": "ebad839a70f8719b40fa78586fc4fa5f5e130e4b", + "url": "https://github.com/openai/codex/commit/ebad839a70f8719b40fa78586fc4fa5f5e130e4b" + }, + { + "author": "bakks", + "committed_at": "2026-06-12T05:36:22Z", + "message": "realtime: update app-server schema fixtures", + "sha": "3a9e2d6f25149e2b2e3fe707ce682b211c007349", + "url": "https://github.com/openai/codex/commit/3a9e2d6f25149e2b2e3fe707ce682b211c007349" + }, + { + "author": "bakks", + "committed_at": "2026-06-12T17:36:33Z", + "message": "[realtime] add TODO for AVAS branching", + "sha": "c8f27780ed88df644693301f7fb79c661a6995d4", + "url": "https://github.com/openai/codex/commit/c8f27780ed88df644693301f7fb79c661a6995d4" + }, + { + "author": "bakks", + "committed_at": "2026-06-12T17:38:54Z", + "message": "[realtime] update AVAS TODO owner", + "sha": "66a18813f2cded55678c34de157ca9143f8a432b", + "url": "https://github.com/openai/codex/commit/66a18813f2cded55678c34de157ca9143f8a432b" + }, + { + "author": "bakks", + "committed_at": "2026-06-12T17:45:41Z", + "message": "Merge remote-tracking branch 'origin/main' into dev/pbakkum/codex-realtime-avas", + "sha": "fa3b65a7e43afac7a10f8c052539b133f2d6dd1f", + "url": "https://github.com/openai/codex/commit/fa3b65a7e43afac7a10f8c052539b133f2d6dd1f" + } + ], + "default_branch": "main", + "docs_refs": [], + "examples_refs": [], + "extracted_flags": [ + "AVAS", + "TODO", + "GENERATED", + "CODE", + "NOT", + "MODIFY", + "HAND", + "BUILT_IN_PERMISSION_PROFILE_READ_ONLY", + "SDP", + "POST", + "CONTENT_TYPE", + "MULTIPART_CONTENT_TYPE", + "LOCATION", + "UUID", + "HTTP", + "URL", + "PROJECT_LOCAL_CONFIG_DENYLIST", + "TOML" + ], + "files": [ + { + "additions": 7, + "deletions": 0, + "patch_excerpt": "@@ -1993,6 +1993,13 @@\n ],\n \"type\": \"object\"\n },\n+ \"RealtimeConversationArchitecture\": {\n+ \"enum\": [\n+ \"realtimeapi\",\n+ \"avas\"\n+ ],\n+ \"type\": \"string\"\n+ },\n \"RealtimeConversationVersion\": {\n \"enum\": [\n \"v1\",", + "path": "codex-rs/app-server-protocol/schema/json/ClientRequest.json", + "status": "modified" + }, + { + "additions": 7, + "deletions": 0, + "patch_excerpt": "@@ -13799,6 +13799,13 @@\n \"title\": \"RawResponseItemCompletedNotification\",\n \"type\": \"object\"\n },\n+ \"RealtimeConversationArchitecture\": {\n+ \"enum\": [\n+ \"realtimeapi\",\n+ \"avas\"\n+ ],\n+ \"type\": \"string\"\n+ },\n \"RealtimeConversationVersion\": {\n \"enum\": [\n \"v1\",", + "path": "codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.schemas.json", + "status": "modified" + }, + { + "additions": 7, + "deletions": 0, + "patch_excerpt": "@@ -10272,6 +10272,13 @@\n \"title\": \"RawResponseItemCompletedNotification\",\n \"type\": \"object\"\n },\n+ \"RealtimeConversationArchitecture\": {\n+ \"enum\": [\n+ \"realtimeapi\",\n+ \"avas\"\n+ ],\n+ \"type\": \"string\"\n+ },\n \"RealtimeConversationVersion\": {\n \"enum\": [\n \"v1\",", + "path": "codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.v2.schemas.json", + "status": "modified" + }, + { + "additions": 5, + "deletions": 0, + "patch_excerpt": "@@ -0,0 +1,5 @@\n+// GENERATED CODE! DO NOT MODIFY BY HAND!\n+\n+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.\n+\n+export type RealtimeConversationArchitecture = \"realtimeapi\" | \"avas\";", + "path": "codex-rs/app-server-protocol/schema/typescript/RealtimeConversationArchitecture.ts", + "status": "added" + }, + { + "additions": 1, + "deletions": 0, + "patch_excerpt": "@@ -51,6 +51,7 @@ export type { NetworkPolicyRuleAction } from \"./NetworkPolicyRuleAction\";\n export type { ParsedCommand } from \"./ParsedCommand\";\n export type { Personality } from \"./Personality\";\n export type { PlanType } from \"./PlanType\";\n+export type { RealtimeConversationArchitecture } from \"./RealtimeConversationArchitecture\";\n export type { RealtimeConversationVersion } from \"./RealtimeConversationVersion\";\n export type { RealtimeOutputModality } from \"./RealtimeOutputModality\";\n export type { RealtimeVoice } from \"./RealtimeVoice\";", + "path": "codex-rs/app-server-protocol/schema/typescript/index.ts", + "status": "modified" + }, + { + "additions": 8, + "deletions": 0, + "patch_excerpt": "@@ -1647,6 +1647,7 @@ mod tests {\n use codex_protocol::account::PlanType;\n use codex_protocol::models::BUILT_IN_PERMISSION_PROFILE_READ_ONLY;\n use codex_protocol::parse_command::ParsedCommand;\n+ use codex_protocol::protocol::RealtimeConversationArchitecture;\n use codex_protocol::protocol::RealtimeConversationVersion;\n use codex_protocol::protocol::RealtimeOutputModality;\n use codex_protocol::protocol::RealtimeVoice;\n@@ -3012,6 +3013,7 @@ mod tests {\n let request = ClientRequest::ThreadRealtimeStart {\n request_id: RequestId::Integer(9),\n params: v2::ThreadRealtimeStartParams {\n+ architecture: Some(RealtimeConversationArchitecture::Avas),\n thread_id: \"thr_123\".to_string(),\n model: Some(\"realtime-treatment-model\".to_string()),\n output_modality: RealtimeOutputModality::Au...", + "path": "codex-rs/app-server-protocol/src/protocol/common.rs", + "status": "modified" + }, + { + "additions": 4, + "deletions": 0, + "patch_excerpt": "@@ -1,4 +1,5 @@\n use codex_protocol::protocol::RealtimeAudioFrame as CoreRealtimeAudioFrame;\n+use codex_protocol::protocol::RealtimeConversationArchitecture;\n use codex_protocol::protocol::RealtimeConversationVersion;\n use codex_protocol::protocol::RealtimeOutputModality;\n use codex_protocol::protocol::RealtimeVoice;\n@@ -65,6 +66,9 @@ impl From for CoreRealtimeAudioFrame {\n #[ts(export_to = \"v2/\")]\n pub struct ThreadRealtimeStartParams {\n pub thread_id: String,\n+ /// Overrides the configured realtime architecture for this session only.\n+ #[ts(optional = nullable)]\n+ pub architecture: Option,\n /// Overrides the configured realtime model for this session only.\n #[ts(optional = nullable)]\n pub model: Option,", + "path": "codex-rs/app-server-protocol/src/protocol/v2/realtime.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 0, + "patch_excerpt": "@@ -934,6 +934,7 @@ impl TurnRequestProcessor {\n request_id,\n thread.as_ref(),\n Op::RealtimeConversationStart(ConversationStartParams {\n+ architecture: params.architecture,\n model: params.model,\n output_modality: params.output_modality,\n prompt: params.prompt,", + "path": "codex-rs/app-server/src/request_processors/turn_processor.rs", + "status": "modified" + }, + { + "additions": 2, + "deletions": 0, + "patch_excerpt": "@@ -79,6 +79,7 @@ async fn realtime_conversation_start_requires_experimental_api_capability() -> R\n \n let request_id = mcp\n .send_thread_realtime_start_request(ThreadRealtimeStartParams {\n+ architecture: None,\n thread_id: \"thr_123\".to_string(),\n model: None,\n output_modality: RealtimeOutputModality::Audio,\n@@ -187,6 +188,7 @@ async fn realtime_webrtc_start_requires_experimental_api_capability() -> Result<\n \n let request_id = mcp\n .send_thread_realtime_start_request(ThreadRealtimeStartParams {\n+ architecture: None,\n thread_id: \"thr_123\".to_string(),\n model: None,\n output_modality: RealtimeOutputModality::Audio,", + "path": "codex-rs/app-server/tests/suite/v2/experimental_api.rs", + "status": "modified" + }, + { + "additions": 7, + "deletions": 0, + "patch_excerpt": "@@ -313,6 +313,7 @@ impl RealtimeE2eHarness {\n let start_request_id = self\n .mcp\n .send_thread_realtime_start_request(ThreadRealtimeStartParams {\n+ architecture: None,\n thread_id: self.thread_id.clone(),\n model: None,\n output_modality: RealtimeOutputModality::Audio,\n@@ -560,6 +561,7 @@ async fn realtime_conversation_streams_v2_notifications() -> Result<()> {\n \n let start_request_id = mcp\n .send_thread_realtime_start_request(ThreadRealtimeStartParams {\n+ architecture: None,\n thread_id: thread_start.thread.id.clone(),\n model: Some(\"realtime-treatment-model\".to_string()),\n output_modality: RealtimeOutputModality::Audio,\n@@ -815,6 +817,7 @@ async fn realtime_text_output_modality_requests_text_output_and_final_transcript\n \n let start_req...", + "path": "codex-rs/app-server/tests/suite/v2/realtime_conversation.rs", + "status": "modified" + }, + { + "additions": 114, + "deletions": 2, + "patch_excerpt": "@@ -6,8 +6,10 @@ use crate::error::ApiError;\n use crate::provider::Provider;\n use bytes::Bytes;\n use codex_client::HttpTransport;\n+use codex_client::Request;\n use codex_client::RequestBody;\n use codex_client::RequestTelemetry;\n+use codex_protocol::protocol::RealtimeConversationArchitecture;\n use http::HeaderMap;\n use http::HeaderValue;\n use http::Method;\n@@ -118,6 +120,22 @@ impl RealtimeCallClient {\n sdp: String,\n session_config: RealtimeSessionConfig,\n extra_headers: HeaderMap,\n+ ) -> Result {\n+ self.create_with_session_architecture_and_headers(\n+ sdp,\n+ session_config,\n+ RealtimeConversationArchitecture::RealtimeApi,\n+ extra_headers,\n+ )\n+ .await\n+ }\n+\n+ pub async fn create_with_session_architecture_and_headers(\n+ &self,\n+ ...", + "path": "codex-rs/codex-api/src/endpoint/realtime_call.rs", + "status": "modified" + }, + { + "additions": 7, + "deletions": 0, + "patch_excerpt": "@@ -372,6 +372,10 @@ pub struct ConfigToml {\n /// `/v1/realtime`\n /// connection) without changing normal provider HTTP requests.\n pub experimental_realtime_ws_base_url: Option,\n+ /// Experimental / do not use. Overrides only the WebRTC realtime call\n+ /// creation base URL. This is separate from `experimental_realtime_ws_base_url`\n+ /// because WebRTC call creation is HTTP, while sideband control is websocket.\n+ pub experimental_realtime_webrtc_call_base_url: Option,\n /// Experimental / do not use. Selects the realtime websocket model/snapshot\n /// used for the `Op::RealtimeConversation` connection.\n pub experimental_realtime_ws_model: Option,\n@@ -583,12 +587,14 @@ pub enum RealtimeTransport {\n Websocket,\n }\n \n+pub use codex_protocol::protocol::RealtimeConversationArchitecture as RealtimeArchitecture;\n pub use codex_protoco...", + "path": "codex-rs/config/src/config_toml.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 0, + "patch_excerpt": "@@ -68,6 +68,7 @@ const PROJECT_LOCAL_CONFIG_DENYLIST: &[&str] = &[\n \"notify\",\n \"profile\",\n \"profiles\",\n+ \"experimental_realtime_webrtc_call_base_url\",\n \"experimental_realtime_ws_base_url\",\n \"otel\",\n ];", + "path": "codex-rs/config/src/loader/mod.rs", + "status": "modified" + }, + { + "additions": 15, + "deletions": 1, + "patch_excerpt": "@@ -2450,6 +2450,13 @@\n },\n \"type\": \"object\"\n },\n+ \"RealtimeConversationArchitecture\": {\n+ \"enum\": [\n+ \"realtimeapi\",\n+ \"avas\"\n+ ],\n+ \"type\": \"string\"\n+ },\n \"RealtimeConversationVersion\": {\n \"enum\": [\n \"v1\",\n@@ -2460,6 +2467,9 @@\n \"RealtimeToml\": {\n \"additionalProperties\": false,\n \"properties\": {\n+ \"architecture\": {\n+ \"$ref\": \"#/definitions/RealtimeConversationArchitecture\"\n+ },\n \"transport\": {\n \"$ref\": \"#/definitions/RealtimeTransport\"\n },\n@@ -4496,6 +4506,10 @@\n \"description\": \"Experimental / do not use. Replaces the built-in realtime start instructions inserted into developer messages when realtime becomes active.\",\n \"type\": \"string\"\n },\n+ \"experimental_realtime_webrtc_call_base_url\": {\n+ \"description\": \"Experimental / do not use...", + "path": "codex-rs/core/config.schema.json", + "status": "modified" + }, + { + "additions": 13, + "deletions": 5, + "patch_excerpt": "@@ -77,6 +77,7 @@ use codex_protocol::models::ResponseItem;\n use codex_protocol::openai_models::ModelInfo;\n use codex_protocol::openai_models::ReasoningEffort as ReasoningEffortConfig;\n use codex_protocol::protocol::InternalSessionSource;\n+use codex_protocol::protocol::RealtimeConversationArchitecture;\n use codex_protocol::protocol::SessionSource;\n use codex_protocol::protocol::W3cTraceContext;\n use codex_rollout_trace::CompactionTraceContext;\n@@ -522,7 +523,9 @@ impl ModelClient {\n &self,\n sdp: String,\n session_config: ApiRealtimeSessionConfig,\n+ architecture: RealtimeConversationArchitecture,\n mut extra_headers: ApiHeaderMap,\n+ api_provider_override: Option,\n ) -> Result {\n // Create the media call over HTTP first, then retain matching auth so realtime can attach\n // the server-side ...", + "path": "codex-rs/core/src/client.rs", + "status": "modified" + }, + { + "additions": 14, + "deletions": 3, + "patch_excerpt": "@@ -12,6 +12,7 @@ use codex_config::config_toml::AutoReviewToml;\n use codex_config::config_toml::ConfigToml;\n use codex_config::config_toml::ExperimentalRequestUserInput;\n use codex_config::config_toml::ProjectConfig;\n+use codex_config::config_toml::RealtimeArchitecture;\n use codex_config::config_toml::RealtimeConfig;\n use codex_config::config_toml::RealtimeToml;\n use codex_config::config_toml::RealtimeTransport;\n@@ -10488,8 +10489,8 @@ experimental_thread_config_endpoint = \"http://127.0.0.1:8061\"\n #[tokio::test]\n async fn experimental_realtime_ws_base_url_loads_from_config_toml() -> std::io::Result<()> {\n let cfg: ConfigToml = toml::from_str(\n- r#\"\n-experimental_realtime_ws_base_url = \"http://127.0.0.1:8011\"\n+ r#\"experimental_realtime_ws_base_url = \"http://127.0.0.1:8011\"\n+experimental_realtime_webrtc_call_base_url = \"http://127.0.0.1:8082/v1\"\n \"#,\n )\n .expect(...", + "path": "codex-rs/core/src/config/config_tests.rs", + "status": "modified" + }, + { + "additions": 6, + "deletions": 0, + "patch_excerpt": "@@ -945,6 +945,9 @@ pub struct Config {\n /// `/v1/realtime`\n /// connection) without changing normal provider HTTP requests.\n pub experimental_realtime_ws_base_url: Option,\n+ /// Experimental / do not use. Overrides only the WebRTC realtime call\n+ /// creation base URL.\n+ pub experimental_realtime_webrtc_call_base_url: Option,\n /// Experimental / do not use. Selects the realtime websocket model/snapshot\n /// used for the `Op::RealtimeConversation` connection.\n pub experimental_realtime_ws_model: Option,\n@@ -3549,12 +3552,15 @@ impl Config {\n speaker: audio.speaker,\n }),\n experimental_realtime_ws_base_url: cfg.experimental_realtime_ws_base_url,\n+ experimental_realtime_webrtc_call_base_url: cfg\n+ .experimental_realtime_webrtc_call_base_url,\n experim...", + "path": "codex-rs/core/src/config/mod.rs", + "status": "modified" + }, + { + "additions": 58, + "deletions": 0, + "patch_excerpt": "@@ -38,6 +38,7 @@ use codex_protocol::protocol::ConversationTextParams;\n use codex_protocol::protocol::ErrorEvent;\n use codex_protocol::protocol::Event;\n use codex_protocol::protocol::EventMsg;\n+use codex_protocol::protocol::RealtimeConversationArchitecture;\n use codex_protocol::protocol::RealtimeConversationClosedEvent;\n use codex_protocol::protocol::RealtimeConversationRealtimeEvent;\n use codex_protocol::protocol::RealtimeConversationSdpEvent;\n@@ -232,7 +233,9 @@ struct ConversationState {\n \n struct RealtimeStart {\n api_provider: ApiProvider,\n+ architecture: RealtimeConversationArchitecture,\n extra_headers: Option,\n+ realtime_call_api_provider: Option,\n session_config: RealtimeSessionConfig,\n model_client: ModelClient,\n sdp: Option,\n@@ -284,7 +287,9 @@ impl RealtimeConversationManager {\n async fn start_inner(&self, start: Re...", + "path": "codex-rs/core/src/realtime_conversation.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 0, + "patch_excerpt": "@@ -200,6 +200,7 @@ async fn start_remote_realtime_server() -> responses::WebSocketTestServer {\n async fn start_realtime_conversation(codex: &codex_core::CodexThread) -> Result<()> {\n codex\n .submit(Op::RealtimeConversationStart(ConversationStartParams {\n+ architecture: None,\n model: None,\n output_modality: RealtimeOutputModality::Audio,\n prompt: Some(Some(\"backend prompt\".to_string())),", + "path": "codex-rs/core/tests/suite/compact_remote.rs", + "status": "modified" + }, + { + "additions": 231, + "deletions": 0, + "patch_excerpt": "@@ -18,6 +18,7 @@ use codex_protocol::protocol::EventMsg;\n use codex_protocol::protocol::InitialHistory;\n use codex_protocol::protocol::Op;\n use codex_protocol::protocol::RealtimeAudioFrame;\n+use codex_protocol::protocol::RealtimeConversationArchitecture;\n use codex_protocol::protocol::RealtimeConversationRealtimeEvent;\n use codex_protocol::protocol::RealtimeConversationVersion;\n use codex_protocol::protocol::RealtimeEvent;\n@@ -282,6 +283,7 @@ async fn conversation_start_audio_text_close_round_trip() -> Result<()> {\n \n test.codex\n .submit(Op::RealtimeConversationStart(ConversationStartParams {\n+ architecture: None,\n model: None,\n output_modality: RealtimeOutputModality::Audio,\n prompt: Some(Some(\"backend prompt\".to_string())),\n@@ -422,6 +424,7 @@ async fn conversation_start_defaults_to_v2_and_gpt_realtime_1_5() -> Result<()>\n \n ...", + "path": "codex-rs/core/tests/suite/realtime_conversation.rs", + "status": "modified" + }, + { + "additions": 11, + "deletions": 0, + "patch_excerpt": "@@ -185,6 +185,8 @@ pub struct McpServerRefreshConfig {\n \n #[derive(Debug, Clone, PartialEq)]\n pub struct ConversationStartParams {\n+ /// Overrides the configured realtime architecture for this session only.\n+ pub architecture: Option,\n /// Overrides the configured realtime model for this session only.\n pub model: Option,\n /// Selects whether the realtime session should produce text or audio output.\n@@ -1495,6 +1497,15 @@ pub enum RealtimeConversationVersion {\n V2,\n }\n \n+#[derive(Debug, Clone, Copy, Default, Deserialize, Serialize, PartialEq, Eq, JsonSchema, TS)]\n+#[serde(rename_all = \"snake_case\")]\n+pub enum RealtimeConversationArchitecture {\n+ #[default]\n+ #[serde(rename = \"realtimeapi\")]\n+ RealtimeApi,\n+ Avas,\n+}\n+\n #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, JsonSchema, TS)]\n pub struct Realtime...", + "path": "codex-rs/protocol/src/protocol.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 0, + "patch_excerpt": "@@ -258,6 +258,7 @@ fn new_config(model: Option, arg0_paths: Arg0DispatchPaths) -> anyhow::R\n apps_mcp_product_sku: None,\n realtime_audio: RealtimeAudioConfig::default(),\n experimental_realtime_ws_base_url: None,\n+ experimental_realtime_webrtc_call_base_url: None,\n experimental_realtime_ws_model: None,\n realtime: RealtimeConfig::default(),\n experimental_realtime_ws_backend_prompt: None,", + "path": "codex-rs/thread-manager-sample/src/main.rs", + "status": "modified" + } + ], + "linked_issues": [], + "notes": [ + "Built from GitHub pull-request, commits, files, and repo endpoints." + ], + "primary_pr": { + "body": "## Summary\n\nAdds a `RealtimeConversationArchitecture` option for realtime conversation startup, with `realtimeapi` as the default and `avas` as an opt-in architecture.\n\nThe AVAS path is limited to realtime v1 conversational WebRTC starts, and WebRTC call creation appends `intent=quicksilver&architecture=avas` to `/v1/realtime/calls`. The existing sideband websocket still joins by `call_id`.\n\nThis also exposes the per-session architecture override through app-server v2 `thread/realtime/start` params and updates the config schema for `[realtime].architecture`.\n\n## Validation\n\n- `just fmt`\n- `just write-config-schema`\n- `just test -p codex-api sends_avas_session_call_query_params`\n- `just test -p codex-core -E 'test(~conversation_webrtc_start_uses_avas_architecture_query)'`\n- `just test -p codex-core -E 'test(realtime_loads_from_config_toml)'`\n- `just test -p codex-app-server-protocol -E 'test(~serialize_thread_realtime_start) | test(generated_ts_optional_nullable_fields_only_in_params)'`\n- `just test -p codex-app-server -E 'test(realtime_webrtc_start_emits_sdp_notification)'`", + "labels": [], + "merged_at": "2026-06-12T18:11:13Z", + "number": 27720, + "state": "merged", + "title": "realtime: add AVAS architecture override", + "url": "https://github.com/openai/codex/pull/27720" + }, + "repo": "openai/codex", + "schema": "github_change_bundle/v1" +} diff --git a/artifacts/github/bundles/openai-codex-pr-27816.json b/artifacts/github/bundles/openai-codex-pr-27816.json new file mode 100644 index 000000000..fe088a8b5 --- /dev/null +++ b/artifacts/github/bundles/openai-codex-pr-27816.json @@ -0,0 +1,349 @@ +{ + "analysis_mode": "pr_first", + "commits": [ + { + "author": "anp-oai", + "committed_at": "2026-06-12T07:47:41Z", + "message": "sandboxing: migrate cwd inputs to PathUri", + "sha": "69a5b897facddfdb48dc4cccb173541f5349aa6f", + "url": "https://github.com/openai/codex/commit/69a5b897facddfdb48dc4cccb173541f5349aa6f" + }, + { + "author": "anp-oai", + "committed_at": "2026-06-12T16:59:44Z", + "message": "codex: address PR review feedback (#27816)", + "sha": "db68524fe5280a98ae8a500448d2c7eb46b33164", + "url": "https://github.com/openai/codex/commit/db68524fe5280a98ae8a500448d2c7eb46b33164" + }, + { + "author": "anp-oai", + "committed_at": "2026-06-12T18:19:33Z", + "message": "codex: address PR review feedback (#27816)", + "sha": "a57dab38147d453e05cd391eed4a3ab83a251f71", + "url": "https://github.com/openai/codex/commit/a57dab38147d453e05cd391eed4a3ab83a251f71" + } + ], + "default_branch": "main", + "docs_refs": [], + "examples_refs": [], + "extracted_flags": [ + "URI", + "REMOTE_ENVIRONMENT_ID", + "DEFAULT_OUTPUT_BYTES_CAP", + "LOCAL_ENVIRONMENT_ID", + "APPLY_PATCH_ARGUMENT_DIFF_BUFFER_INTERVAL", + "PROXY_ENV_KEYS", + "PROXY_GIT_SSH_COMMAND_ENV_KEY", + "CUSTOM_ENV", + "PTY", + "FS_HELPER_BAZEL_BWRAP_ENV_ALLOWLIST", + "TEST_WORKSPACE", + "JSONRPCE", + "JSONRPCM", + "JSONRPCR", + "INITIALIZED_METHOD", + "UNC", + "FS_READ_FILE_METHOD", + "STANDARD", + "TODO" + ], + "files": [ + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -3020,7 +3020,6 @@ name = \"codex-file-system\"\n version = \"0.0.0\"\n dependencies = [\n \"codex-protocol\",\n- \"codex-utils-absolute-path\",\n \"codex-utils-path-uri\",\n \"serde\",\n ]\n@@ -3755,6 +3754,7 @@ dependencies = [\n \"codex-network-proxy\",\n \"codex-protocol\",\n \"codex-utils-absolute-path\",\n+ \"codex-utils-path-uri\",\n \"dunce\",\n \"libc\",\n \"pretty_assertions\",", + "path": "codex-rs/Cargo.lock", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -57,7 +57,7 @@ pub(crate) async fn load_project_instructions(\n config,\n filesystem.as_ref(),\n &turn_environment.environment_id,\n- &turn_environment.cwd,\n+ turn_environment.cwd(),\n )\n .await\n {", + "path": "codex-rs/core/src/agents_md.rs", + "status": "modified" + }, + { + "additions": 11, + "deletions": 8, + "patch_excerpt": "@@ -258,14 +258,17 @@ fn resolved_local_environments(\n ResolvedTurnEnvironments {\n turn_environments: environments\n .into_iter()\n- .map(|(environment_id, cwd)| TurnEnvironment {\n- environment_id: environment_id.to_string(),\n- environment: Arc::new(\n- Environment::create_for_tests(/*exec_server_url*/ None)\n- .expect(\"local environment\"),\n- ),\n- cwd,\n- shell: None,\n+ .map(|(environment_id, cwd)| {\n+ TurnEnvironment::new(\n+ environment_id.to_string(),\n+ Arc::new(\n+ Environment::create_for_tests(/*exec_server_url*/ None)\n+ .expect(\"local environment\"),\n+ ),\n+ cwd,\n+ ...", + "path": "codex-rs/core/src/agents_md_tests.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -46,7 +46,7 @@ impl EnvironmentContextEnvironment {\n .iter()\n .map(|environment| Self {\n id: environment.environment_id.clone(),\n- cwd: environment.cwd.clone(),\n+ cwd: environment.cwd().clone(),\n shell: environment\n .shell\n .as_ref()", + "path": "codex-rs/core/src/context/environment_context.rs", + "status": "modified" + }, + { + "additions": 20, + "deletions": 16, + "patch_excerpt": "@@ -58,7 +58,7 @@ impl ResolvedTurnEnvironments {\n return None;\n };\n \n- (!environment.environment.is_remote()).then_some(&environment.cwd)\n+ (!environment.environment.is_remote()).then_some(environment.cwd())\n }\n }\n \n@@ -96,12 +96,12 @@ pub(crate) async fn resolve_environment_selections(\n None\n }\n };\n- turn_environments.push(TurnEnvironment {\n+ turn_environments.push(TurnEnvironment::new(\n environment_id,\n environment,\n- cwd: selected_environment.cwd.clone(),\n+ selected_environment.cwd.clone(),\n shell,\n- });\n+ )?);\n }\n Ok(ResolvedTurnEnvironments { turn_environments })\n }\n@@ -270,22 +270,26 @@ url = \"ws://127.0.0.1:8765\"\n .expect(\"remote environment\"),\n );\n let remote = ResolvedTurnEnvironme...", + "path": "codex-rs/core/src/environment_selection.rs", + "status": "modified" + }, + { + "additions": 11, + "deletions": 5, + "patch_excerpt": "@@ -44,6 +44,7 @@ use codex_sandboxing::SandboxType;\n use codex_sandboxing::SandboxablePreference;\n use codex_sandboxing::compatibility_sandbox_policy_for_permission_profile;\n use codex_utils_absolute_path::AbsolutePathBuf;\n+use codex_utils_path_uri::PathUri;\n use codex_utils_pty::DEFAULT_OUTPUT_BYTES_CAP;\n use codex_utils_pty::process_group::kill_child_process_group;\n \n@@ -372,6 +373,14 @@ pub fn build_exec_request(\n \"command args are empty\",\n ))\n })?;\n+ let cwd = PathUri::from_abs_path(&cwd).map_err(|_| {\n+ CodexErr::InvalidRequest(\"command cwd cannot be represented as a file URI\".to_string())\n+ })?;\n+ let sandbox_policy_cwd_uri = PathUri::from_abs_path(sandbox_cwd).map_err(|_| {\n+ CodexErr::InvalidRequest(\n+ \"sandbox policy cwd cannot be represented as a file URI\".to_string(),\n+ )\n+ })?;\n \n let manager = SandboxMa...", + "path": "codex-rs/core/src/exec.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -743,7 +743,7 @@ async fn run_review_on_session(\n .parent_turn\n .environments\n .primary()\n- .map(|environment| environment.cwd.clone())\n+ .map(|environment| environment.cwd().clone())\n .unwrap_or_else(|| params.parent_turn.config.cwd.clone());\n \n let submit_result = run_before_review_deadline(", + "path": "codex-rs/core/src/guardian/review_session.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -103,12 +103,12 @@ impl ExecRequest {\n pub(crate) fn from_sandbox_exec_request(\n request: SandboxExecRequest,\n options: ExecOptions,\n- windows_sandbox_policy_cwd: AbsolutePathBuf,\n windows_sandbox_workspace_roots: Vec,\n ) -> Self {\n let SandboxExecRequest {\n command,\n cwd,\n+ sandbox_policy_cwd: windows_sandbox_policy_cwd,\n mut env,\n network,\n sandbox,", + "path": "codex-rs/core/src/sandboxing/mod.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -314,7 +314,7 @@ impl Session {\n let mcp_runtime_context = match turn_context.environments.primary() {\n Some(turn_environment) => McpRuntimeContext::new(\n Arc::clone(&self.services.environment_manager),\n- turn_environment.cwd.to_path_buf(),\n+ turn_environment.cwd().to_path_buf(),\n ),\n None => McpRuntimeContext::new(\n Arc::clone(&self.services.environment_manager),", + "path": "codex-rs/core/src/session/mcp.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -1135,7 +1135,7 @@ impl Session {\n let mcp_runtime_context = match turn_environment {\n Some(turn_environment) => McpRuntimeContext::new(\n Arc::clone(&sess.services.environment_manager),\n- turn_environment.cwd.to_path_buf(),\n+ turn_environment.cwd().to_path_buf(),\n ),\n None => McpRuntimeContext::new(\n Arc::clone(&sess.services.environment_manager),", + "path": "codex-rs/core/src/session/session.rs", + "status": "modified" + }, + { + "additions": 30, + "deletions": 21, + "patch_excerpt": "@@ -4035,12 +4035,15 @@ fn turn_environments_for_tests(\n cwd: &codex_utils_absolute_path::AbsolutePathBuf,\n ) -> crate::environment_selection::ResolvedTurnEnvironments {\n crate::environment_selection::ResolvedTurnEnvironments {\n- turn_environments: vec![TurnEnvironment {\n- environment_id: codex_exec_server::LOCAL_ENVIRONMENT_ID.to_string(),\n- environment: Arc::clone(environment),\n- cwd: cwd.clone(),\n- shell: None,\n- }],\n+ turn_environments: vec![\n+ TurnEnvironment::new(\n+ codex_exec_server::LOCAL_ENVIRONMENT_ID.to_string(),\n+ Arc::clone(environment),\n+ cwd.clone(),\n+ /*shell*/ None,\n+ )\n+ .expect(\"turn environment\"),\n+ ],\n }\n }\n \n@@ -5656,8 +5659,14 @@ async fn request_permissions_tool_resolves_relative_paths_agai...", + "path": "codex-rs/core/src/session/tests.rs", + "status": "modified" + }, + { + "additions": 3, + "deletions": 3, + "patch_excerpt": "@@ -416,10 +416,10 @@ async fn turn_diff_display_roots(turn_context: &TurnContext) -> Vec<(String, Pat\n for turn_environment in &turn_context.environments.turn_environments {\n let root = get_git_repo_root_with_fs(\n turn_environment.environment.get_filesystem().as_ref(),\n- &turn_environment.cwd,\n+ turn_environment.cwd(),\n )\n .await\n- .unwrap_or_else(|| turn_environment.cwd.clone())\n+ .unwrap_or_else(|| turn_environment.cwd().clone())\n .into_path_buf();\n display_roots.push((turn_environment.environment_id.clone(), root));\n }\n@@ -630,7 +630,7 @@ async fn build_extension_turn_input_items(\n .enumerate()\n .map(|(index, environment)| TurnInputEnvironment {\n environment_id: environment.environment_id.clone(),\n- cwd: environment.cwd.as_path().to_path_buf(),\n+ ...", + "path": "codex-rs/core/src/session/turn.rs", + "status": "modified" + }, + { + "additions": 38, + "deletions": 3, + "patch_excerpt": "@@ -17,6 +17,7 @@ use codex_protocol::protocol::TurnEnvironmentSelection;\n use codex_sandboxing::compatibility_sandbox_policy_for_permission_profile;\n use codex_sandboxing::policy_transforms::effective_file_system_sandbox_policy;\n use codex_sandboxing::policy_transforms::effective_network_sandbox_policy;\n+use codex_utils_path_uri::PathUri;\n use std::sync::atomic::AtomicBool;\n use std::sync::atomic::Ordering;\n \n@@ -39,11 +40,45 @@ impl TurnSkillsContext {\n pub(crate) struct TurnEnvironment {\n pub(crate) environment_id: String,\n pub(crate) environment: Arc,\n- pub(crate) cwd: AbsolutePathBuf,\n+ // Keep both representations together while cwd consumers migrate to URI semantics. Keeping\n+ // them synchronized means neither representation can be exposed through a mutable reference;\n+ // updates must rebuild the validated pair through `TurnEnvironment::new`. Onc...", + "path": "codex-rs/core/src/session/turn_context.rs", + "status": "modified" + }, + { + "additions": 8, + "deletions": 8, + "patch_excerpt": "@@ -648,12 +648,12 @@ async fn resume_and_fork_do_not_restore_thread_environments_from_rollout() {\n .expect(\"build resumed turn context\");\n assert_eq!(resumed_turn.environments.turn_environments.len(), 1);\n assert_eq!(\n- resumed_turn.environments.turn_environments[0].cwd,\n- default_cwd\n+ resumed_turn.environments.turn_environments[0].cwd(),\n+ &default_cwd\n );\n assert_ne!(\n- resumed_turn.environments.turn_environments[0].cwd,\n- selected_cwd\n+ resumed_turn.environments.turn_environments[0].cwd(),\n+ &selected_cwd\n );\n \n let forked = manager\n@@ -675,12 +675,12 @@ async fn resume_and_fork_do_not_restore_thread_environments_from_rollout() {\n .expect(\"build forked turn context\");\n assert_eq!(forked_turn.environments.turn_environments.len(), 1);\n assert_eq!(\n- forked_turn.environments.t...", + "path": "codex-rs/core/src/thread_manager_tests.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -312,5 +312,5 @@ fn single_local_environment_cwd(turn: &TurnContext) -> Result<&AbsolutePathBuf,\n ));\n }\n \n- Ok(&turn_environment.cwd)\n+ Ok(turn_environment.cwd())\n }", + "path": "codex-rs/core/src/tools/handlers/agent_jobs/spawn_agents_on_csv.rs", + "status": "modified" + }, + { + "additions": 14, + "deletions": 3, + "patch_excerpt": "@@ -52,6 +52,7 @@ use codex_sandboxing::policy_transforms::normalize_additional_permissions;\n use codex_tools::ToolName;\n use codex_tools::ToolSpec;\n use codex_utils_absolute_path::AbsolutePathBuf;\n+use codex_utils_path_uri::PathUri;\n \n const APPLY_PATCH_ARGUMENT_DIFF_BUFFER_INTERVAL: Duration = Duration::from_millis(500);\n /// Handles freeform `apply_patch` requests and routes verified patches to the\n@@ -358,9 +359,12 @@ impl ApplyPatchHandler {\n \"apply_patch is unavailable in this session\".to_string(),\n ));\n };\n- let cwd = turn_environment.cwd.clone();\n+ let cwd = turn_environment.cwd().clone();\n let fs = turn_environment.environment.get_filesystem();\n- let sandbox = turn.file_system_sandbox_context(/*additional_permissions*/ None, &cwd);\n+ let sandbox = turn.file_system_sandbox_context(\n+ /*additional_p...", + "path": "codex-rs/core/src/tools/handlers/apply_patch.rs", + "status": "modified" + }, + { + "additions": 20, + "deletions": 5, + "patch_excerpt": "@@ -117,19 +117,20 @@ async fn to_extension_call(invocation: &ToolInvocation) -> ExtensionToolCall {\n let additional_permissions = apply_granted_turn_permissions(\n invocation.session.as_ref(),\n &environment.environment_id,\n- environment.cwd.as_path(),\n+ environment.cwd().as_path(),\n SandboxPermissions::UseDefault,\n /*additional_permissions*/ None,\n )\n .await\n .additional_permissions;\n+ let file_system_sandbox_context = invocation\n+ .turn\n+ .file_system_sandbox_context(additional_permissions, environment.cwd_uri());\n environments.push(ToolEnvironment {\n environment_id: environment.environment_id.clone(),\n- cwd: environment.cwd.clone(),\n+ cwd: environment.cwd().clone(),\n file_system: environment.environment....", + "path": "codex-rs/core/src/tools/handlers/extension_tools.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -71,7 +71,7 @@ impl RequestPermissionsHandler {\n ));\n };\n let mut args: RequestPermissionsArgs =\n- parse_arguments_with_base_path(&arguments, &turn_environment.cwd)?;\n+ parse_arguments_with_base_path(&arguments, turn_environment.cwd())?;\n args.permissions = normalize_additional_permissions(args.permissions.into())\n .map(codex_protocol::request_permissions::RequestPermissionProfile::from)\n .map_err(FunctionCallError::RespondToModel)?;", + "path": "codex-rs/core/src/tools/handlers/request_permissions.rs", + "status": "modified" + }, + { + "additions": 3, + "deletions": 3, + "patch_excerpt": "@@ -134,8 +134,8 @@ impl ExecCommandHandler {\n .as_deref()\n .filter(|workdir| !workdir.is_empty())\n .map_or_else(\n- || turn_environment.cwd.clone(),\n- |workdir| turn_environment.cwd.join(workdir),\n+ || turn_environment.cwd().clone(),\n+ |workdir| turn_environment.cwd().join(workdir),\n );\n let environment = Arc::clone(&turn_environment.environment);\n let fs = environment.get_filesystem();\n@@ -270,7 +270,7 @@ impl ExecCommandHandler {\n yield_time_ms,\n max_output_tokens,\n cwd,\n- sandbox_cwd: turn_environment.cwd.clone(),\n+ sandbox_cwd: turn_environment.cwd().clone(),\n environment,\n shell_mode,\n network: context.tur...", + "path": "codex-rs/core/src/tools/handlers/unified_exec/exec_command.rs", + "status": "modified" + }, + { + "additions": 25, + "deletions": 12, + "patch_excerpt": "@@ -143,9 +143,12 @@ impl ViewImageHandler {\n \"view_image is unavailable in this session\".to_string(),\n ));\n };\n- let cwd = turn_environment.cwd.clone();\n+ let cwd = turn_environment.cwd().clone();\n let abs_path = cwd.join(path);\n- let sandbox = turn.file_system_sandbox_context(/*additional_permissions*/ None, &cwd);\n+ let sandbox = turn.file_system_sandbox_context(\n+ /*additional_permissions*/ None,\n+ turn_environment.cwd_uri(),\n+ );\n let fs = turn_environment.environment.get_filesystem();\n let path_uri = PathUri::from_abs_path(&abs_path).map_err(|error| {\n FunctionCallError::RespondToModel(format!(\n@@ -268,16 +271,34 @@ impl ToolOutput for ViewImageOutput {\n mod tests {\n use super::*;\n use crate::session::tests::make_session_and_context;\n+ use crat...", + "path": "codex-rs/core/src/tools/handlers/view_image.rs", + "status": "modified" + }, + { + "additions": 8, + "deletions": 2, + "patch_excerpt": "@@ -39,6 +39,7 @@ use codex_protocol::protocol::NetworkPolicyRuleAction;\n use codex_protocol::protocol::ReviewDecision;\n use codex_sandboxing::SandboxManager;\n use codex_sandboxing::SandboxType;\n+use codex_utils_path_uri::PathUri;\n use std::time::Instant;\n \n pub(crate) struct ToolOrchestrator {\n@@ -239,13 +240,18 @@ impl ToolOrchestrator {\n let use_legacy_landlock = turn_ctx.features.use_legacy_landlock();\n #[allow(deprecated)]\n let sandbox_cwd = tool.sandbox_cwd(req).unwrap_or(&turn_ctx.cwd);\n+ let sandbox_policy_cwd = PathUri::from_abs_path(sandbox_cwd).map_err(|_| {\n+ ToolError::Codex(CodexErr::InvalidRequest(\n+ \"sandbox policy cwd cannot be represented as a file URI\".to_string(),\n+ ))\n+ })?;\n let workspace_roots = turn_ctx.config.effective_workspace_roots();\n let initial_attempt = SandboxAttemp...", + "path": "codex-rs/core/src/tools/orchestrator.rs", + "status": "modified" + }, + { + "additions": 16, + "deletions": 9, + "patch_excerpt": "@@ -11,16 +11,18 @@ use codex_sandboxing::SandboxManager;\n use codex_sandboxing::SandboxType;\n use codex_sandboxing::policy_transforms::effective_file_system_sandbox_policy;\n use codex_sandboxing::policy_transforms::effective_network_sandbox_policy;\n+use codex_utils_path_uri::PathUri;\n use core_test_support::PathBufExt;\n use pretty_assertions::assert_eq;\n use std::collections::HashMap;\n fn test_turn_environment(environment_id: &str) -> crate::session::turn_context::TurnEnvironment {\n- crate::session::turn_context::TurnEnvironment {\n- environment_id: environment_id.to_string(),\n- environment: std::sync::Arc::new(codex_exec_server::Environment::default_for_tests()),\n- cwd: std::env::temp_dir().abs(),\n- shell: None,\n- }\n+ crate::session::turn_context::TurnEnvironment::new(\n+ environment_id.to_string(),\n+ std::sync::Arc::new(codex_exec_serve...", + "path": "codex-rs/core/src/tools/runtimes/apply_patch_tests.rs", + "status": "modified" + }, + { + "additions": 11, + "deletions": 3, + "patch_excerpt": "@@ -21,10 +21,12 @@ use codex_network_proxy::PROXY_ENV_KEYS;\n use codex_network_proxy::PROXY_GIT_SSH_COMMAND_ENV_KEY;\n use codex_network_proxy::is_managed_mitm_ca_trust_bundle_path;\n use codex_protocol::config_types::WindowsSandboxLevel;\n+use codex_protocol::error::CodexErr;\n use codex_protocol::models::AdditionalPermissionProfile;\n use codex_sandboxing::SandboxCommand;\n use codex_sandboxing::SandboxType;\n use codex_utils_absolute_path::AbsolutePathBuf;\n+use codex_utils_path_uri::PathUri;\n use std::collections::HashMap;\n #[cfg(unix)]\n use std::path::Path;\n@@ -33,8 +35,9 @@ pub(crate) mod apply_patch;\n pub(crate) mod shell;\n pub(crate) mod unified_exec;\n \n-/// Shared helper to construct sandbox transform inputs from a tokenized command line.\n-/// Validates that at least a program is present.\n+/// Shared helper to construct sandbox transform inputs from a tokenized command line and native\n...", + "path": "codex-rs/core/src/tools/runtimes/mod.rs", + "status": "modified" + }, + { + "additions": 13, + "deletions": 4, + "patch_excerpt": "@@ -25,6 +25,7 @@ use codex_protocol::models::PermissionProfile;\n use codex_sandboxing::SandboxManager;\n use codex_sandboxing::SandboxType;\n use codex_utils_absolute_path::AbsolutePathBuf;\n+use codex_utils_path_uri::PathUri;\n use core_test_support::PathBufExt;\n use core_test_support::PathExt;\n use pretty_assertions::assert_eq;\n@@ -88,18 +89,21 @@ async fn test_network_proxy() -> anyhow::Result {\n async fn explicit_escalation_prepares_exec_without_managed_network() -> anyhow::Result<()> {\n let proxy = test_network_proxy().await?;\n let dir = tempdir().expect(\"create temp dir\");\n- let cwd = dir.path().abs();\n+ let command_cwd = dir.path().join(\"command\").abs();\n+ let native_sandbox_policy_cwd = dir.path().join(\"sandbox-policy\").abs();\n let mut env = HashMap::from([(\"CUSTOM_ENV\".to_string(), \"kept\".to_string())]);\n proxy.apply_to_env(&mut env);\n \n l...", + "path": "codex-rs/core/src/tools/runtimes/mod_tests.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -310,7 +310,7 @@ impl ToolRuntime for ShellRuntime {\n };\n let env = attempt\n .env_for(command, options, managed_network)\n- .map_err(|err| ToolError::Codex(err.into()))?;\n+ .map_err(ToolError::Codex)?;\n let out = execute_env(env, Self::stdout_stream(ctx))\n .await\n .map_err(ToolError::Codex)?;", + "path": "codex-rs/core/src/tools/runtimes/shell.rs", + "status": "modified" + }, + { + "additions": 13, + "deletions": 4, + "patch_excerpt": "@@ -66,6 +66,7 @@ use codex_shell_escalation::ShellCommandExecutor;\n use codex_shell_escalation::ShellCommandExecutorFuture;\n use codex_shell_escalation::Stopwatch;\n use codex_utils_absolute_path::AbsolutePathBuf;\n+use codex_utils_path_uri::PathUri;\n use std::collections::HashMap;\n use std::path::PathBuf;\n use std::sync::Arc;\n@@ -143,7 +144,7 @@ pub(super) async fn try_run_zsh_fork(\n options,\n managed_network_for_sandbox_permissions(req.network.as_ref(), req.sandbox_permissions),\n )\n- .map_err(|err| ToolError::Codex(err.into()))?;\n+ .map_err(ToolError::Codex)?;\n let crate::sandboxing::ExecRequest {\n command,\n cwd: sandbox_cwd,\n@@ -968,10 +969,19 @@ impl CoreShellCommandExecutor {\n self.windows_sandbox_level,\n self.network.is_some(),\n );\n+ let cwd = PathUri::from_abs_path(workdir).map_...", + "path": "codex-rs/core/src/tools/runtimes/shell/unix_escalation.rs", + "status": "modified" + }, + { + "additions": 14, + "deletions": 4, + "patch_excerpt": "@@ -326,11 +326,16 @@ impl<'a> ToolRuntime for UnifiedExecRunt\n if let UnifiedExecShellMode::ZshFork(zsh_fork_config) = &self.shell_mode {\n let command =\n build_sandbox_command(&command, &req.cwd, &env, req.additional_permissions.clone())\n- .map_err(|_| ToolError::Rejected(\"missing command line for PTY\".to_string()))?;\n+ .map_err(|error| match error {\n+ ToolError::Rejected(_) => {\n+ ToolError::Rejected(\"missing command line for PTY\".to_string())\n+ }\n+ error @ ToolError::Codex(_) => error,\n+ })?;\n let options = unified_exec_options(attempt.network_denial_cancellation_token.clone());\n let mut exec_env = attempt\n .env_for(comm...", + "path": "codex-rs/core/src/tools/runtimes/unified_exec.rs", + "status": "modified" + }, + { + "additions": 11, + "deletions": 17, + "patch_excerpt": "@@ -21,12 +21,12 @@ use codex_protocol::protocol::AskForApproval;\n use codex_protocol::protocol::ReviewDecision;\n use codex_sandboxing::SandboxCommand;\n use codex_sandboxing::SandboxManager;\n-use codex_sandboxing::SandboxTransformError;\n use codex_sandboxing::SandboxTransformRequest;\n use codex_sandboxing::SandboxType;\n use codex_sandboxing::SandboxablePreference;\n use codex_tools::ToolName;\n use codex_utils_absolute_path::AbsolutePathBuf;\n+use codex_utils_path_uri::PathUri;\n use futures::Future;\n use futures::future::BoxFuture;\n use serde::Serialize;\n@@ -411,7 +411,7 @@ pub(crate) struct SandboxAttempt<'a> {\n pub permissions: &'a codex_protocol::models::PermissionProfile,\n pub enforce_managed_network: bool,\n pub(crate) manager: &'a SandboxManager,\n- pub(crate) sandbox_cwd: &'a AbsolutePathBuf,\n+ pub(crate) sandbox_cwd: &'a PathUri,\n pub(crate) workspace_roots: &'a ...", + "path": "codex-rs/core/src/tools/sandboxing.rs", + "status": "modified" + }, + { + "additions": 10, + "deletions": 9, + "patch_excerpt": "@@ -573,21 +573,22 @@ async fn zsh_fork_unified_exec_keeps_shell_parameter_when_remote_environment_ava\n .environments\n .primary()\n .expect(\"primary environment\")\n- .cwd\n+ .cwd()\n .clone();\n- turn.environments\n- .turn_environments\n- .push(crate::session::turn_context::TurnEnvironment {\n- environment_id: \"remote\".to_string(),\n- environment: Arc::new(\n+ turn.environments.turn_environments.push(\n+ crate::session::turn_context::TurnEnvironment::new(\n+ \"remote\".to_string(),\n+ Arc::new(\n codex_exec_server::Environment::create_for_tests(Some(\n \"ws://127.0.0.1:1/remote-exec-server\".to_string(),\n ))\n .expect(\"remote test environment\"),\n ...", + "path": "codex-rs/core/src/tools/spec_plan_tests.rs", + "status": "modified" + }, + { + "additions": 81, + "deletions": 15, + "patch_excerpt": "@@ -15,6 +15,7 @@ use codex_sandboxing::SandboxTransformRequest;\n use codex_sandboxing::SandboxablePreference;\n use codex_utils_absolute_path::AbsolutePathBuf;\n use codex_utils_absolute_path::canonicalize_preserving_symlinks;\n+use codex_utils_path_uri::PathUri;\n use tokio::io::AsyncWriteExt;\n use tokio::process::Command;\n \n@@ -39,6 +40,12 @@ const FS_HELPER_BAZEL_BWRAP_ENV_ALLOWLIST: &[&str] = &[\n \"TEST_WORKSPACE\",\n ];\n \n+#[derive(Debug, PartialEq, Eq)]\n+struct SandboxCwd {\n+ uri: PathUri,\n+ native: AbsolutePathBuf,\n+}\n+\n #[derive(Clone, Debug)]\n pub(crate) struct FileSystemSandboxRunner {\n runtime_paths: ExecServerRuntimePaths,\n@@ -65,23 +72,27 @@ impl FileSystemSandboxRunner {\n } else {\n helper_read_roots(&self.runtime_paths)\n };\n- add_helper_runtime_permissions(&mut file_system_policy, &helper_read_roots, cwd.as_path());\n+ add_he...", + "path": "codex-rs/exec-server/src/fs_sandbox.rs", + "status": "modified" + }, + { + "additions": 14, + "deletions": 3, + "patch_excerpt": "@@ -450,6 +450,8 @@ mod base64_bytes {\n mod tests {\n use super::FsReadFileParams;\n use super::HttpRequestParams;\n+ use crate::FileSystemSandboxContext;\n+ use codex_protocol::models::PermissionProfile;\n use codex_utils_path_uri::PathUri;\n use pretty_assertions::assert_eq;\n \n@@ -458,22 +460,31 @@ mod tests {\n let legacy_path = std::env::current_dir()\n .expect(\"current directory\")\n .join(\"legacy-file.txt\");\n+ let legacy_cwd = std::env::current_dir().expect(\"current directory\");\n+ let expected_sandbox = FileSystemSandboxContext::from_permission_profile_with_cwd(\n+ PermissionProfile::default(),\n+ PathUri::from_path(&legacy_cwd).expect(\"cwd URI\"),\n+ );\n+ let mut legacy_sandbox =\n+ serde_json::to_value(&expected_sandbox).expect(\"sandbox should serialize\");\n+ legacy_sandbox[\"...", + "path": "codex-rs/exec-server/src/protocol.rs", + "status": "modified" + }, + { + "additions": 7, + "deletions": 2, + "patch_excerpt": "@@ -321,6 +321,7 @@ mod tests {\n use codex_protocol::permissions::FileSystemSpecialPath;\n use codex_protocol::permissions::NetworkSandboxPolicy;\n use codex_utils_absolute_path::AbsolutePathBuf;\n+ use codex_utils_path_uri::PathUri;\n use pretty_assertions::assert_eq;\n \n use super::*;\n@@ -337,7 +338,7 @@ mod tests {\n PermissionProfile::from_runtime_permissions(&policy, NetworkSandboxPolicy::Restricted);\n let sandbox_context = FileSystemSandboxContext::from_permission_profile_with_cwd(\n permissions,\n- absolute_test_path(\"host-checkout\"),\n+ path_uri(\"host-checkout\"),\n );\n \n let remote_context =\n@@ -356,7 +357,7 @@ mod tests {\n }]);\n let permissions =\n PermissionProfile::from_runtime_permissions(&policy, NetworkSandboxPolicy::Restricted);\n- let cwd = absolute_test_pat...", + "path": "codex-rs/exec-server/src/remote_file_system.rs", + "status": "modified" + }, + { + "additions": 51, + "deletions": 14, + "patch_excerpt": "@@ -2,6 +2,13 @@\n \n use codex_app_server_protocol::JSONRPCMessage;\n use codex_app_server_protocol::JSONRPCResponse;\n+use codex_protocol::models::PermissionProfile;\n+use codex_protocol::permissions::FileSystemAccessMode;\n+use codex_protocol::permissions::FileSystemPath;\n+use codex_protocol::permissions::FileSystemSandboxEntry;\n+use codex_protocol::permissions::FileSystemSandboxPolicy;\n+use codex_protocol::permissions::FileSystemSpecialPath;\n+use codex_protocol::permissions::NetworkSandboxPolicy;\n use codex_utils_path_uri::PathUri;\n use futures::SinkExt;\n use futures::StreamExt;\n@@ -25,51 +32,72 @@ use crate::protocol::INITIALIZED_METHOD;\n use crate::protocol::InitializeResponse;\n \n #[tokio::test]\n-async fn remote_file_system_sends_path_uris_without_native_conversion() {\n- let (websocket_url, captured_paths, server) =\n- record_read_file_paths(/*expected_requests*/ 2).await;\n+asyn...", + "path": "codex-rs/exec-server/src/remote_file_system_path_uri_tests.rs", + "status": "modified" + }, + { + "additions": 11, + "deletions": 15, + "patch_excerpt": "@@ -189,7 +189,6 @@ fn map_fs_error(err: io::Error) -> JSONRPCErrorError {\n mod tests {\n use codex_protocol::protocol::NetworkAccess;\n use codex_protocol::protocol::SandboxPolicy;\n- use codex_utils_absolute_path::AbsolutePathBuf;\n use codex_utils_path_uri::PathUri;\n use pretty_assertions::assert_eq;\n \n@@ -207,8 +206,14 @@ mod tests {\n )\n .expect(\"runtime paths\");\n let handler = FileSystemHandler::new(runtime_paths);\n- let sandbox_cwd =\n- AbsolutePathBuf::from_absolute_path(temp_dir.path()).expect(\"absolute tempdir\");\n+ let sandbox_cwd = PathUri::from_path(temp_dir.path()).expect(\"tempdir URI\");\n+ let sandbox_context = |sandbox_policy| {\n+ FileSystemSandboxContext::from_legacy_sandbox_policy(\n+ sandbox_policy,\n+ sandbox_cwd.clone(),\n+ )\n+ .expect(\"sandb...", + "path": "codex-rs/exec-server/src/server/file_system_handler.rs", + "status": "modified" + }, + { + "additions": 0, + "deletions": 1, + "patch_excerpt": "@@ -9,7 +9,6 @@ workspace = true\n \n [dependencies]\n codex-protocol = { workspace = true }\n-codex-utils-absolute-path = { workspace = true }\n codex-utils-path-uri = { workspace = true }\n serde = { workspace = true, features = [\"derive\"] }", + "path": "codex-rs/file-system/Cargo.toml", + "status": "modified" + }, + { + "additions": 15, + "deletions": 13, + "patch_excerpt": "@@ -7,7 +7,6 @@ use codex_protocol::permissions::FileSystemSandboxPolicy;\n use codex_protocol::permissions::FileSystemSpecialPath;\n use codex_protocol::permissions::NetworkSandboxPolicy;\n use codex_protocol::protocol::SandboxPolicy;\n-use codex_utils_absolute_path::AbsolutePathBuf;\n use codex_utils_path_uri::PathUri;\n use std::future::Future;\n use std::io;\n@@ -51,7 +50,7 @@ pub struct ReadDirectoryEntry {\n pub struct FileSystemSandboxContext {\n pub permissions: PermissionProfile,\n #[serde(default, skip_serializing_if = \"Option::is_none\")]\n- pub cwd: Option,\n+ pub cwd: Option,\n pub windows_sandbox_level: WindowsSandboxLevel,\n #[serde(default)]\n pub windows_sandbox_private_desktop: bool,\n@@ -60,32 +59,35 @@ pub struct FileSystemSandboxContext {\n }\n \n impl FileSystemSandboxContext {\n- pub fn from_legacy_sandbox_policy(sandbox_policy: San...", + "path": "codex-rs/file-system/src/lib.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 0, + "patch_excerpt": "@@ -16,6 +16,7 @@ workspace = true\n codex-network-proxy = { workspace = true }\n codex-protocol = { workspace = true }\n codex-utils-absolute-path = { workspace = true }\n+codex-utils-path-uri = { workspace = true }\n dunce = { workspace = true }\n libc = { workspace = true }\n serde_json = { workspace = true }", + "path": "codex-rs/sandboxing/Cargo.toml", + "status": "modified" + }, + { + "additions": 4, + "deletions": 0, + "patch_excerpt": "@@ -33,6 +33,10 @@ pub fn system_bwrap_warning(\n impl From for CodexErr {\n fn from(err: SandboxTransformError) -> Self {\n match err {\n+ error @ SandboxTransformError::InvalidCommandCwd { .. }\n+ | error @ SandboxTransformError::InvalidSandboxPolicyCwd { .. } => {\n+ CodexErr::InvalidRequest(error.to_string())\n+ }\n SandboxTransformError::MissingLinuxSandboxExecutable => {\n CodexErr::LandlockSandboxExecutableNotProvided\n }", + "path": "codex-rs/sandboxing/src/lib.rs", + "status": "modified" + }, + { + "additions": 58, + "deletions": 8, + "patch_excerpt": "@@ -15,8 +15,10 @@ use codex_protocol::permissions::FileSystemSandboxPolicy;\n use codex_protocol::permissions::NetworkSandboxPolicy;\n use codex_protocol::protocol::SandboxPolicy;\n use codex_utils_absolute_path::AbsolutePathBuf;\n+use codex_utils_path_uri::PathUri;\n use std::collections::HashMap;\n use std::ffi::OsString;\n+use std::io;\n use std::path::Path;\n \n #[derive(Clone, Copy, Debug, PartialEq, Eq)]\n@@ -86,15 +88,20 @@ pub fn with_managed_mitm_ca_readable_root(\n pub struct SandboxCommand {\n pub program: OsString,\n pub args: Vec,\n- pub cwd: AbsolutePathBuf,\n+ pub cwd: PathUri,\n pub env: HashMap,\n pub additional_permissions: Option,\n }\n \n+/// A host-native launch request produced after [`SandboxManager::transform`] validates URI inputs.\n+/// Build this only at the execution boundary: in exec-server, or in its logi...", + "path": "codex-rs/sandboxing/src/manager.rs", + "status": "modified" + }, + { + "additions": 15, + "deletions": 8, + "patch_excerpt": "@@ -17,6 +17,7 @@ use codex_protocol::permissions::FileSystemSandboxPolicy;\n use codex_protocol::permissions::FileSystemSpecialPath;\n use codex_protocol::permissions::NetworkSandboxPolicy;\n use codex_utils_absolute_path::AbsolutePathBuf;\n+use codex_utils_path_uri::PathUri;\n use dunce::canonicalize;\n use pretty_assertions::assert_eq;\n use std::collections::HashMap;\n@@ -74,6 +75,7 @@ fn restricted_file_system_uses_platform_sandbox_without_managed_network() {\n fn transform_preserves_unrestricted_file_system_policy_for_restricted_network() {\n let manager = SandboxManager::new();\n let cwd = AbsolutePathBuf::current_dir().expect(\"current dir\");\n+ let cwd_uri = PathUri::from_abs_path(&cwd).expect(\"cwd URI\");\n let permissions = PermissionProfile::from_runtime_permissions(\n &FileSystemSandboxPolicy::unrestricted(),\n NetworkSandboxPolicy::Restricted,\n@@ -83,22 +85,24...", + "path": "codex-rs/sandboxing/src/manager_tests.rs", + "status": "modified" + } + ], + "linked_issues": [ + "#27816" + ], + "notes": [ + "Built from GitHub pull-request, commits, files, and repo endpoints." + ], + "primary_pr": { + "body": "## Why\n\nSandbox cwd values can cross app-server and exec-server host boundaries. They should retain URI semantics until the receiving host validates them instead of being interpreted early as native paths.\n\n## What\n\n- Carry `PathUri` through filesystem sandbox contexts, sandbox commands, and transform inputs.\n- Convert command and policy cwd once in `SandboxManager::transform`, then keep launch requests native.\n- Preserve sandbox cwd over remote filesystem transport and reject non-native URIs without fallback.\n- Cache paired native/URI turn-environment cwd values during migration, with immutable access to keep them synchronized.\n- Extend existing protocol, forwarding, transform, and core runtime tests.", + "labels": [], + "merged_at": "2026-06-12T18:38:02Z", + "number": 27816, + "state": "merged", + "title": "sandboxing: migrate cwd inputs to PathUri", + "url": "https://github.com/openai/codex/pull/27816" + }, + "repo": "openai/codex", + "schema": "github_change_bundle/v1" +} diff --git a/artifacts/github/bundles/openai-codex-pr-27890.json b/artifacts/github/bundles/openai-codex-pr-27890.json new file mode 100644 index 000000000..bba3ffb4c --- /dev/null +++ b/artifacts/github/bundles/openai-codex-pr-27890.json @@ -0,0 +1,131 @@ +{ + "analysis_mode": "pr_first", + "commits": [ + { + "author": "ericning-o", + "committed_at": "2026-06-12T15:18:37Z", + "message": "[plugins] expose remote plugin share URL", + "sha": "79e6ea4a8182b747e0329082a2b70215a70253b3", + "url": "https://github.com/openai/codex/commit/79e6ea4a8182b747e0329082a2b70215a70253b3" + }, + { + "author": "ericning-o", + "committed_at": "2026-06-12T17:36:19Z", + "message": "[plugins] address share URL review feedback", + "sha": "f63cf1908952d8daed71bcdb63efda76bfa15ef2", + "url": "https://github.com/openai/codex/commit/f63cf1908952d8daed71bcdb63efda76bfa15ef2" + } + ], + "default_branch": "main", + "docs_refs": [ + "codex-rs/app-server/README.md" + ], + "examples_refs": [], + "extracted_flags": [ + "JSON", + "URL", + "--all", + "AVAILABLE", + "DISABLED_BY_ADMIN", + "MCP", + "JSONRPCE", + "JSONRPCR", + "GLOBAL", + "ON_USE", + "NOT_CONFIGURED_FOR_WORKSPACE" + ], + "files": [ + { + "additions": 6, + "deletions": 0, + "patch_excerpt": "@@ -12536,6 +12536,12 @@\n },\n \"type\": \"array\"\n },\n+ \"shareUrl\": {\n+ \"type\": [\n+ \"string\",\n+ \"null\"\n+ ]\n+ },\n \"skills\": {\n \"items\": {\n \"$ref\": \"#/definitions/v2/SkillSummary\"", + "path": "codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.schemas.json", + "status": "modified" + }, + { + "additions": 6, + "deletions": 0, + "patch_excerpt": "@@ -9009,6 +9009,12 @@\n },\n \"type\": \"array\"\n },\n+ \"shareUrl\": {\n+ \"type\": [\n+ \"string\",\n+ \"null\"\n+ ]\n+ },\n \"skills\": {\n \"items\": {\n \"$ref\": \"#/definitions/SkillSummary\"", + "path": "codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.v2.schemas.json", + "status": "modified" + }, + { + "additions": 6, + "deletions": 0, + "patch_excerpt": "@@ -192,6 +192,12 @@\n },\n \"type\": \"array\"\n },\n+ \"shareUrl\": {\n+ \"type\": [\n+ \"string\",\n+ \"null\"\n+ ]\n+ },\n \"skills\": {\n \"items\": {\n \"$ref\": \"#/definitions/SkillSummary\"", + "path": "codex-rs/app-server-protocol/schema/json/v2/PluginReadResponse.json", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -8,4 +8,4 @@ import type { PluginHookSummary } from \"./PluginHookSummary\";\n import type { PluginSummary } from \"./PluginSummary\";\n import type { SkillSummary } from \"./SkillSummary\";\n \n-export type PluginDetail = { marketplaceName: string, marketplacePath: AbsolutePathBuf | null, summary: PluginSummary, description: string | null, skills: Array, hooks: Array, apps: Array, appTemplates: Array, mcpServers: Array, };\n+export type PluginDetail = { marketplaceName: string, marketplacePath: AbsolutePathBuf | null, summary: PluginSummary, shareUrl: string | null, description: string | null, skills: Array, hooks: Array, apps: Array, appTemplates: Array, mcpServers: Array, };", + "path": "codex-rs/app-server-protocol/schema/typescript/v2/PluginDetail.ts", + "status": "modified" + }, + { + "additions": 1, + "deletions": 0, + "patch_excerpt": "@@ -638,6 +638,7 @@ pub struct PluginDetail {\n pub marketplace_name: String,\n pub marketplace_path: Option,\n pub summary: PluginSummary,\n+ pub share_url: Option,\n pub description: Option,\n pub skills: Vec,\n pub hooks: Vec,", + "path": "codex-rs/app-server-protocol/src/protocol/v2/plugin.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 1, + "patch_excerpt": "@@ -206,7 +206,7 @@ Example with notification opt-out:\n - `marketplace/upgrade` — upgrade all configured Git plugin marketplaces, or one named marketplace when `marketplaceName` is provided. Returns selected marketplace names, upgraded roots, and per-marketplace errors.\n - `plugin/list` — list discovered plugin marketplaces and plugin state, including effective marketplace install/auth policy metadata, plugin `availability` (`AVAILABLE` by default or `DISABLED_BY_ADMIN` for remote plugins blocked upstream), fail-open `marketplaceLoadErrors` entries for marketplace files that could not be parsed or loaded, and best-effort `featuredPluginIds` for the official curated marketplace. `interface.category` uses the marketplace category when present; otherwise it falls back to the plugin manifest category (**under development; do not call from production clients yet**).\n - `plugin/installed` — li...", + "path": "codex-rs/app-server/README.md", + "status": "modified" + }, + { + "additions": 2, + "deletions": 0, + "patch_excerpt": "@@ -1070,6 +1070,7 @@ impl PluginRequestProcessor {\n interface: outcome.plugin.interface.map(local_plugin_interface_to_info),\n keywords: outcome.plugin.keywords,\n },\n+ share_url: None,\n description: outcome.plugin.description,\n skills: plugin_skills_to_info(\n &visible_skills,\n@@ -2081,6 +2082,7 @@ fn remote_plugin_detail_to_info(\n marketplace_name: detail.marketplace_name,\n marketplace_path: None,\n summary: remote_plugin_summary_to_info(detail.summary),\n+ share_url: detail.share_url,\n description: detail.description,\n skills: detail\n .skills", + "path": "codex-rs/app-server/src/request_processors/plugins.rs", + "status": "modified" + }, + { + "additions": 57, + "deletions": 45, + "patch_excerpt": "@@ -23,6 +23,7 @@ use codex_app_server_protocol::HookEventName;\n use codex_app_server_protocol::JSONRPCError;\n use codex_app_server_protocol::JSONRPCResponse;\n use codex_app_server_protocol::PluginAuthPolicy;\n+use codex_app_server_protocol::PluginAvailability;\n use codex_app_server_protocol::PluginInstallPolicy;\n use codex_app_server_protocol::PluginReadParams;\n use codex_app_server_protocol::PluginReadResponse;\n@@ -392,7 +393,7 @@ async fn plugin_read_returns_share_context_for_shared_remote_plugin() -> Result<\n }\n \n #[tokio::test]\n-async fn plugin_read_reads_remote_plugin_details_when_remote_plugin_enabled() -> Result<()> {\n+async fn plugin_read_includes_share_url_for_admin_disabled_remote_plugin() -> Result<()> {\n let codex_home = TempDir::new()?;\n let server = MockServer::start().await;\n write_remote_plugin_catalog_config(\n@@ -410,29 +411,31 @@ async fn plugin_read_reads_r...", + "path": "codex-rs/app-server/tests/suite/v2/plugin_read.rs", + "status": "modified" + }, + { + "additions": 2, + "deletions": 0, + "patch_excerpt": "@@ -163,6 +163,7 @@ pub struct RemotePluginDetail {\n pub marketplace_name: String,\n pub marketplace_display_name: String,\n pub summary: RemotePluginSummary,\n+ pub share_url: Option,\n pub description: Option,\n pub release_version: Option,\n pub bundle_download_url: Option,\n@@ -1048,6 +1049,7 @@ async fn build_remote_plugin_detail(\n marketplace_name,\n marketplace_display_name: scope.marketplace_display_name().to_string(),\n summary: build_remote_plugin_summary(&plugin, installed_plugin.as_ref())?,\n+ share_url: plugin.share_url,\n description: non_empty_string(Some(&plugin.release.description)),\n release_version: plugin.release.version,\n bundle_download_url: plugin.release.bundle_download_url,", + "path": "codex-rs/core-plugins/src/remote.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 0, + "patch_excerpt": "@@ -1421,6 +1421,7 @@ pub(super) fn plugins_test_detail(\n marketplace_name: \"ChatGPT Marketplace\".to_string(),\n marketplace_path: Some(plugins_test_absolute_path(\"marketplaces/chatgpt\")),\n summary,\n+ share_url: None,\n description: description.map(str::to_string),\n skills: skills\n .iter()", + "path": "codex-rs/tui/src/chatwidget/tests/helpers.rs", + "status": "modified" + }, + { + "additions": 3, + "deletions": 0, + "patch_excerpt": "@@ -803,6 +803,7 @@ async fn plugin_detail_remote_install_uses_remote_location() {\n marketplace_name: \"workspace-shared-with-me-private\".to_string(),\n marketplace_path: None,\n summary,\n+ share_url: None,\n description: Some(\"Install shared Linear plugin.\".to_string()),\n skills: Vec::new(),\n hooks: Vec::new(),\n@@ -877,6 +878,7 @@ async fn plugin_detail_remote_uninstall_uses_remote_plugin_id() {\n marketplace_name: \"workspace-shared-with-me-private\".to_string(),\n marketplace_path: None,\n summary,\n+ share_url: None,\n description: Some(\"Installed shared Linear plugin.\".to_string()),\n skills: Vec::new(),\n hooks: Vec::new(),\n@@ -949,6 +951,7 @@ async fn plugin_detail_remote_wit...", + "path": "codex-rs/tui/src/chatwidget/tests/popups_and_settings.rs", + "status": "modified" + } + ], + "linked_issues": [], + "notes": [ + "Built from GitHub pull-request, commits, files, and repo endpoints." + ], + "primary_pr": { + "body": "## Summary\n\n- expose the remote plugin detail endpoint's `share_url` as nullable `PluginDetail.shareUrl`\n- preserve existing `PluginSummary.shareContext` behavior for local and workspace sharing flows\n- regenerate the app-server TypeScript and JSON schema fixtures\n\n## Why\n\nThe remote plugin detail response already includes a canonical `share_url`, but that value was not surfaced by `plugin/read` for global plugins. Global plugins intentionally have no `shareContext`, so using that model for the URL would change the semantics consumed by the existing share modal.\n\n## User impact\n\nCodex clients can use `PluginDetail.shareUrl` for a remote plugin's copy-link action, including when the plugin is disabled by an administrator, without changing existing share-modal or ownership behavior.\n\n## Validation\n\n- `cargo test -p codex-app-server plugin_read_includes_share_url_for_admin_disabled_remote_plugin`\n- `cargo test -p codex-app-server-protocol typescript_schema_fixtures_match_generated`\n- `cargo test -p codex-app-server-protocol json_schema_fixtures_match_generated`\n- `cargo fmt --all`\n", + "labels": [], + "merged_at": "2026-06-12T18:53:56Z", + "number": 27890, + "state": "merged", + "title": "[codex] expose remote plugin share URL", + "url": "https://github.com/openai/codex/pull/27890" + }, + "repo": "openai/codex", + "schema": "github_change_bundle/v1" +} diff --git a/artifacts/github/bundles/openai-codex-pr-27927.json b/artifacts/github/bundles/openai-codex-pr-27927.json new file mode 100644 index 000000000..17d558860 --- /dev/null +++ b/artifacts/github/bundles/openai-codex-pr-27927.json @@ -0,0 +1,119 @@ +{ + "analysis_mode": "pr_first", + "commits": [ + { + "author": "pakrym-oai", + "committed_at": "2026-06-12T18:26:17Z", + "message": "Add size to filesystem metadata", + "sha": "138e4eeeeaaeed2d04a74283e13e30124a75bcd1", + "url": "https://github.com/openai/codex/commit/138e4eeeeaaeed2d04a74283e13e30124a75bcd1" + }, + { + "author": "pakrym-oai", + "committed_at": "2026-06-12T18:34:38Z", + "message": "Keep filesystem size internal", + "sha": "d4e267882417929bfa34d49398f7043f95cddc3c", + "url": "https://github.com/openai/codex/commit/d4e267882417929bfa34d49398f7043f95cddc3c" + } + ], + "default_branch": "main", + "docs_refs": [], + "examples_refs": [], + "extracted_flags": [ + "API" + ], + "files": [ + { + "additions": 1, + "deletions": 0, + "patch_excerpt": "@@ -129,6 +129,7 @@ impl ExecutorFileSystem for SyntheticPluginFileSystem {\n is_directory,\n is_file,\n is_symlink: false,\n+ size: 0,\n created_at_ms: 0,\n modified_at_ms: 0,\n })", + "path": "codex-rs/core-plugins/src/provider_tests.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 0, + "patch_excerpt": "@@ -233,6 +233,7 @@ pub(crate) async fn run_direct_request(\n is_directory: metadata.is_directory,\n is_file: metadata.is_file,\n is_symlink: metadata.is_symlink,\n+ size: metadata.size,\n created_at_ms: metadata.created_at_ms,\n modified_at_ms: metadata.modified_at_ms,\n }))", + "path": "codex-rs/exec-server/src/fs_helper.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 0, + "patch_excerpt": "@@ -483,6 +483,7 @@ impl DirectFileSystem {\n is_directory: metadata.is_dir(),\n is_file: metadata.is_file(),\n is_symlink: symlink_metadata.file_type().is_symlink(),\n+ size: metadata.len(),\n created_at_ms: metadata.created().ok().map_or(0, system_time_to_unix_ms),\n modified_at_ms: metadata.modified().ok().map_or(0, system_time_to_unix_ms),\n })", + "path": "codex-rs/exec-server/src/local_file_system.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 0, + "patch_excerpt": "@@ -244,6 +244,7 @@ pub struct FsGetMetadataResponse {\n pub is_directory: bool,\n pub is_file: bool,\n pub is_symlink: bool,\n+ pub size: u64,\n pub created_at_ms: i64,\n pub modified_at_ms: i64,\n }", + "path": "codex-rs/exec-server/src/protocol.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 0, + "patch_excerpt": "@@ -132,6 +132,7 @@ impl RemoteFileSystem {\n is_directory: response.is_directory,\n is_file: response.is_file,\n is_symlink: response.is_symlink,\n+ size: response.size,\n created_at_ms: response.created_at_ms,\n modified_at_ms: response.modified_at_ms,\n })", + "path": "codex-rs/exec-server/src/remote_file_system.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 0, + "patch_excerpt": "@@ -164,6 +164,7 @@ impl SandboxedFileSystem {\n is_directory: response.is_directory,\n is_file: response.is_file,\n is_symlink: response.is_symlink,\n+ size: response.size,\n created_at_ms: response.created_at_ms,\n modified_at_ms: response.modified_at_ms,\n })", + "path": "codex-rs/exec-server/src/sandboxed_file_system.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 0, + "patch_excerpt": "@@ -103,6 +103,7 @@ impl FileSystemHandler {\n is_directory: metadata.is_directory,\n is_file: metadata.is_file,\n is_symlink: metadata.is_symlink,\n+ size: metadata.size,\n created_at_ms: metadata.created_at_ms,\n modified_at_ms: metadata.modified_at_ms,\n })", + "path": "codex-rs/exec-server/src/server/file_system_handler.rs", + "status": "modified" + }, + { + "additions": 40, + "deletions": 7, + "patch_excerpt": "@@ -2,6 +2,7 @@ use anyhow::Context;\n use anyhow::Result;\n use codex_exec_server::CopyOptions;\n use codex_exec_server::CreateDirectoryOptions;\n+use codex_exec_server::FileMetadata;\n use codex_exec_server::ReadDirectoryEntry;\n use codex_exec_server::RemoveOptions;\n use codex_protocol::models::AdditionalPermissionProfile;\n@@ -65,18 +66,34 @@ async fn file_system_get_metadata_reports_files_and_directories(\n .get_metadata(&PathUri::from_path(&file_path)?, /*sandbox*/ None)\n .await\n .with_context(|| format!(\"mode={implementation}\"))?;\n- assert_eq!(file_metadata.is_directory, false);\n- assert_eq!(file_metadata.is_file, true);\n- assert_eq!(file_metadata.is_symlink, false);\n+ assert_eq!(\n+ file_metadata,\n+ FileMetadata {\n+ is_directory: false,\n+ is_file: true,\n+ is_symlink: false,\n+ size: 5,\n+ ...", + "path": "codex-rs/exec-server/tests/file_system/shared.rs", + "status": "modified" + }, + { + "additions": 23, + "deletions": 6, + "patch_excerpt": "@@ -21,6 +21,7 @@ use codex_exec_server::CopyOptions;\n use codex_exec_server::CreateDirectoryOptions;\n #[cfg(target_os = \"linux\")]\n use codex_exec_server::Environment;\n+use codex_exec_server::FileMetadata;\n use codex_exec_server::RemoveOptions;\n use codex_utils_path_uri::PathUri;\n use pretty_assertions::assert_eq;\n@@ -222,9 +223,17 @@ async fn file_system_get_metadata_reports_symlink_targets(\n .get_metadata(&PathUri::from_path(&symlink_path)?, /*sandbox*/ None)\n .await\n .with_context(|| format!(\"mode={implementation}\"))?;\n- assert_eq!(symlink_metadata.is_directory, false);\n- assert_eq!(symlink_metadata.is_file, true);\n- assert_eq!(symlink_metadata.is_symlink, true);\n+ assert_eq!(\n+ symlink_metadata,\n+ FileMetadata {\n+ is_directory: false,\n+ is_file: true,\n+ is_symlink: true,\n+ size: 5,\n+ ...", + "path": "codex-rs/exec-server/tests/file_system_unix.rs", + "status": "modified" + }, + { + "additions": 1, + "deletions": 0, + "patch_excerpt": "@@ -85,6 +85,7 @@ impl SyntheticFileSystem {\n is_directory,\n is_file,\n is_symlink: false,\n+ size: 0,\n created_at_ms: 0,\n modified_at_ms: 0,\n })", + "path": "codex-rs/ext/skills/tests/executor_file_system_authority.rs", + "status": "modified" + }, + { + "additions": 2, + "deletions": 0, + "patch_excerpt": "@@ -35,6 +35,8 @@ pub struct FileMetadata {\n pub is_directory: bool,\n pub is_file: bool,\n pub is_symlink: bool,\n+ /// Size in bytes.\n+ pub size: u64,\n pub created_at_ms: i64,\n pub modified_at_ms: i64,\n }", + "path": "codex-rs/file-system/src/lib.rs", + "status": "modified" + } + ], + "linked_issues": [], + "notes": [ + "Built from GitHub pull-request, commits, files, and repo endpoints." + ], + "primary_pr": { + "body": "## Why\n\n`ExecutorFileSystem::get_metadata` reports file kind and timestamps but not size. Internal callers that need to enforce a size limit therefore have to read the complete file first, which is especially wasteful for remote filesystems.\n\nThis adds the missing internal metadata so consumers can reject oversized files before transferring or buffering them. The field is named `size`, matching VS Code's `FileStat.size` filesystem convention.\n\n## What changed\n\n- add `size: u64` to internal `FileMetadata`\n- populate it from the underlying filesystem metadata\n- carry it through sandbox-helper and remote exec-server responses\n- cover files, directories, symlink targets, and sandboxed reads across local and remote filesystem implementations\n\nThe new field is intentionally not exposed through the app-server API.\n\n## Testing\n\n- `just test -p codex-exec-server get_metadata`\n- `just test -p codex-exec-server file_system_sandboxed_metadata_and_read_allow_readable_root`\n- `just test -p codex-core-plugins`\n- `just test -p codex-skills-extension`\n", + "labels": [], + "merged_at": "2026-06-12T19:12:08Z", + "number": 27927, + "state": "merged", + "title": "[codex] Add size to internal filesystem metadata", + "url": "https://github.com/openai/codex/pull/27927" + }, + "repo": "openai/codex", + "schema": "github_change_bundle/v1" +} diff --git a/artifacts/github/impact/openai-codex-pr-27720.json b/artifacts/github/impact/openai-codex-pr-27720.json new file mode 100644 index 000000000..fcecf4321 --- /dev/null +++ b/artifacts/github/impact/openai-codex-pr-27720.json @@ -0,0 +1,47 @@ +{ + "candidate_followups": [ + "Check Decodex app-server protocol handling for realtime start params before assuming only model, modality, prompt, voice, and version fields exist.", + "Keep AVAS framed as opt-in and experimental unless later upstream evidence changes the rollout status.", + "Consider adding a Control Plane compatibility fixture for nullable realtime architecture when Decodex consumes generated app-server types." + ], + "caveats": [ + "The default architecture remains `realtimeapi`.", + "The WebRTC call base URL configuration is explicitly experimental.", + "The PR evidence is source-backed but does not prove general AVAS availability outside supported realtime v1 WebRTC starts." + ], + "confidence": "confirmed", + "control_plane_impact": "compat_risk", + "evidence": [ + "App-server v2 `ThreadRealtimeStartParams` gains nullable `architecture`.", + "The protocol enum has `realtimeapi` and `avas` values.", + "Core realtime startup and WebRTC call creation carry the architecture choice.", + "Config schema adds `[realtime].architecture`.", + "The source-backed review is recorded at `artifacts/github/reviews/openai-codex-pr-27720.review.json`." + ], + "observed_change": "Codex adds an opt-in AVAS realtime architecture for WebRTC starts and exposes the choice through app-server realtime-start params and config.", + "public_signal_decision": "publish", + "publisher_angle": "operator_impact", + "repo": "openai/codex", + "schema": "upstream_impact/v1", + "slug": "openai-codex-pr-27720", + "social_notes": [ + "Frame the post for Control Plane operators watching realtime protocol changes.", + "Do not imply AVAS became the default or that non-WebRTC realtime paths changed." + ], + "source_refs": { + "items": [ + { + "kind": "pull_request", + "meta": "Merged 2026-06-12T18:11:13Z", + "title": "realtime: add AVAS architecture override", + "url": "https://github.com/openai/codex/pull/27720" + }, + { + "kind": "pull_request", + "meta": "artifacts/github/reviews/openai-codex-pr-27720.review.json", + "title": "Source-backed Decodex upstream review", + "url": "https://github.com/openai/codex/pull/27720" + } + ] + } +} diff --git a/artifacts/github/impact/openai-codex-pr-27816.json b/artifacts/github/impact/openai-codex-pr-27816.json new file mode 100644 index 000000000..f949b6689 --- /dev/null +++ b/artifacts/github/impact/openai-codex-pr-27816.json @@ -0,0 +1,47 @@ +{ + "candidate_followups": [ + "Audit Decodex sandbox-context serialization and any assumptions that cwd is always a native absolute path.", + "Add or update Control Plane compatibility tests around remote filesystem cwd URIs if Decodex mirrors upstream app-server or exec-server behavior.", + "Watch for downstream failures where non-native cwd URIs now fail closed instead of falling back to local interpretation." + ], + "caveats": [ + "This is mostly internal protocol and execution-boundary plumbing.", + "The public explanation should avoid implying a new CLI feature.", + "Exact Decodex changes need a separate implementation issue if local code still assumes native cwd paths." + ], + "confidence": "confirmed", + "control_plane_impact": "compat_risk", + "evidence": [ + "Filesystem sandbox context cwd now uses `PathUri`.", + "Sandbox command transforms now carry URI cwd and convert to native launch requests at the execution boundary.", + "Turn environments keep synchronized native and URI cwd representations.", + "Remote filesystem tests cover PathUri behavior.", + "The source-backed review is recorded at `artifacts/github/reviews/openai-codex-pr-27816.review.json`." + ], + "observed_change": "Codex migrates sandbox cwd handling to `PathUri` across core, sandboxing, filesystem, and exec-server boundaries.", + "public_signal_decision": "publish", + "publisher_angle": "operator_impact", + "repo": "openai/codex", + "schema": "upstream_impact/v1", + "slug": "openai-codex-pr-27816", + "social_notes": [ + "Frame this as a compatibility watch for remote and sandboxed execution boundaries.", + "Mention that it preserves URI semantics until host validation, not a new visible feature." + ], + "source_refs": { + "items": [ + { + "kind": "pull_request", + "meta": "Merged 2026-06-12T18:38:02Z", + "title": "sandboxing: migrate cwd inputs to PathUri", + "url": "https://github.com/openai/codex/pull/27816" + }, + { + "kind": "pull_request", + "meta": "artifacts/github/reviews/openai-codex-pr-27816.review.json", + "title": "Source-backed Decodex upstream review", + "url": "https://github.com/openai/codex/pull/27816" + } + ] + } +} diff --git a/artifacts/github/impact/openai-codex-pr-27890.json b/artifacts/github/impact/openai-codex-pr-27890.json new file mode 100644 index 000000000..d43fcfeb6 --- /dev/null +++ b/artifacts/github/impact/openai-codex-pr-27890.json @@ -0,0 +1,47 @@ +{ + "candidate_followups": [ + "Regenerate or tolerate generated app-server plugin detail types where Decodex consumes `PluginDetail`.", + "Use `shareUrl` rather than `shareContext` for remote plugin copy-link affordances.", + "Keep local and workspace share-context semantics separate from remote canonical share URLs." + ], + "caveats": [ + "`shareUrl` is nullable.", + "Existing `PluginSummary.shareContext` behavior is intentionally unchanged.", + "The change is app-server/plugin metadata behavior, not plugin installation policy." + ], + "confidence": "confirmed", + "control_plane_impact": "candidate", + "evidence": [ + "App-server protocol `PluginDetail` adds nullable `share_url`.", + "Remote plugin detail conversion passes through `share_url`.", + "Local plugin detail sets `share_url` to null.", + "Plugin read tests cover admin-disabled remote plugin share URLs.", + "The source-backed review is recorded at `artifacts/github/reviews/openai-codex-pr-27890.review.json`." + ], + "observed_change": "Codex exposes remote plugin canonical share URLs as nullable `PluginDetail.shareUrl` while preserving existing share-context behavior.", + "public_signal_decision": "publish", + "publisher_angle": "practical_explainer", + "repo": "openai/codex", + "schema": "upstream_impact/v1", + "slug": "openai-codex-pr-27890", + "social_notes": [ + "Frame this as a practical remote-plugin UI affordance.", + "Do not imply shareContext changed or that disabled plugins become installable." + ], + "source_refs": { + "items": [ + { + "kind": "pull_request", + "meta": "Merged 2026-06-12T18:53:56Z", + "title": "[codex] expose remote plugin share URL", + "url": "https://github.com/openai/codex/pull/27890" + }, + { + "kind": "pull_request", + "meta": "artifacts/github/reviews/openai-codex-pr-27890.review.json", + "title": "Source-backed Decodex upstream review", + "url": "https://github.com/openai/codex/pull/27890" + } + ] + } +} diff --git a/artifacts/github/impact/openai-codex-pr-27927.json b/artifacts/github/impact/openai-codex-pr-27927.json new file mode 100644 index 000000000..0df100606 --- /dev/null +++ b/artifacts/github/impact/openai-codex-pr-27927.json @@ -0,0 +1,45 @@ +{ + "candidate_followups": [ + "Evaluate whether Decodex remote-file and artifact-ingestion paths can use metadata size before reading large files.", + "Avoid treating the field as public app-server protocol until upstream exposes separate evidence.", + "Check any internal FileMetadata fixtures if Decodex mirrors upstream exec-server metadata structs." + ], + "caveats": [ + "The upstream PR states the size field is intentionally not exposed through app-server API.", + "This is more useful for future implementation planning than immediate public publishing." + ], + "confidence": "confirmed", + "control_plane_impact": "candidate", + "evidence": [ + "Internal `FileMetadata` adds `size: u64`.", + "Exec-server metadata response carries `size`.", + "Local, remote, and sandboxed filesystem metadata paths populate or forward the size value.", + "Tests cover files, directories, symlink targets, and sandboxed metadata reads.", + "The source-backed review is recorded at `artifacts/github/reviews/openai-codex-pr-27927.review.json`." + ], + "observed_change": "Codex adds an internal `size` field to filesystem metadata and carries it through local, remote, and sandboxed exec-server metadata paths.", + "public_signal_decision": "defer", + "publisher_angle": "none", + "repo": "openai/codex", + "schema": "upstream_impact/v1", + "slug": "openai-codex-pr-27927", + "social_notes": [ + "Do not publish from this artifact alone; the source-backed value is internal and implementation-oriented." + ], + "source_refs": { + "items": [ + { + "kind": "pull_request", + "meta": "Merged 2026-06-12T19:12:08Z", + "title": "[codex] Add size to internal filesystem metadata", + "url": "https://github.com/openai/codex/pull/27927" + }, + { + "kind": "pull_request", + "meta": "artifacts/github/reviews/openai-codex-pr-27927.review.json", + "title": "Source-backed Decodex upstream review", + "url": "https://github.com/openai/codex/pull/27927" + } + ] + } +} diff --git a/artifacts/github/review-queue/openai-codex-latest.json b/artifacts/github/review-queue/openai-codex-latest.json index f941c8b82..d3e2c12df 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": 22, - "high": 10, - "low": 1, - "normal": 7, + "critical": 21, + "high": 5, + "low": 0, + "normal": 14, "published_subjects_seen": 0, "recent_commits_scanned": 40, "subjects_queued": 40 }, - "generated_at": "2026-06-12T20:06:37.368497Z", + "generated_at": "2026-06-13T02:07:18.76819Z", "repo": "openai/codex", "schema": "upstream_review_queue/v1", "source": { @@ -20,773 +20,389 @@ { "attention_flags": [ "deprecated_removed", - "new_feature", - "protocol_change" - ], - "changed_file_count": 8, - "commit_shas": [ - "eafa1fc84190009a6d53378565460290dba3ceb8", - "682f2b9c28f8bdc54c8b48e2f1587228b81c90ed", - "0b34bb09f82857993b511572569cdcfdaa9430ab", - "6b06a574cc1be682580cfce269d755e3140e39f6", - "8f878400ea36dbcbc573a2f8d5bfacfe1b8c73b6", - "d2132fbc5250d96109f5c30b05a07432afa5afd3" - ], - "committed_at": "2026-06-11T23:24:12Z", - "next_step": "ai_review_required", - "pr_number": 27318, - "pr_url": "https://github.com/openai/codex/pull/27318", - "review_priority": "critical", - "review_reason": "Needs AI review for deprecated_removed, new_feature, protocol_change.", - "sample_paths": [ - "codex-rs/app-server-protocol/src/protocol/thread_history.rs", - "codex-rs/core/src/session/session.rs", - "codex-rs/thread-store/src/in_memory.rs", - "codex-rs/thread-store/src/lib.rs", - "codex-rs/thread-store/src/live_thread.rs", - "codex-rs/thread-store/src/local/live_writer.rs", - "codex-rs/thread-store/src/store.rs", - "codex-rs/thread-store/src/types.rs" - ], - "source_state": "merged", - "subject_id": "27318", - "subject_kind": "pr", - "surface_hints": [ - "app_server_protocol" - ], - "title": "[codex] Move persistence policy application into ThreadStore", - "url": "https://github.com/openai/codex/pull/27318" - }, - { - "attention_flags": [ - "auth_account", - "deprecated_removed", - "new_feature", - "protocol_change", - "security_policy" - ], - "changed_file_count": 14, - "commit_shas": [ - "27e50cfa078191d4d61f281fcb4307b3fd8d2e97", - "526c3e8565b00151ee29f620978650f07610e9ee", - "6467362a57ce5befcf5895c4df10d5bae82a92e6", - "2feef6f6c77bcd8140bc126377410bcdf3b89915", - "18126046137392d29cb21f2f734160b52cfa1ea5", - "f8ab6ef5dc39035114a695d5dc5952ff1aad7fa6", - "03f5b38cf9b4d10eb8d9f1a94ddd0d503aacd257", - "59544fbc520493779b297162c114ee185392c521" - ], - "committed_at": "2026-06-11T23:32:52Z", - "next_step": "ai_review_required", - "pr_number": 27498, - "pr_url": "https://github.com/openai/codex/pull/27498", - "review_priority": "critical", - "review_reason": "Needs AI review for auth_account, deprecated_removed, new_feature, protocol_change, security_policy.", - "sample_paths": [ - "codex-rs/Cargo.lock", - "codex-rs/app-server/tests/suite/v2/imagegen_extension.rs", - "codex-rs/core/src/tools/handlers/extension_tools.rs", - "codex-rs/core/tests/suite/extension_sandbox.rs", - "codex-rs/core/tests/suite/mod.rs", - "codex-rs/ext/extension-api/src/lib.rs", - "codex-rs/ext/goal/tests/goal_extension_backend.rs", - "codex-rs/ext/image-generation/Cargo.toml", - "codex-rs/ext/image-generation/src/tests.rs", - "codex-rs/ext/image-generation/src/tool.rs", - "codex-rs/ext/memories/src/tests.rs", - "codex-rs/tools/Cargo.toml" - ], - "source_state": "merged", - "subject_id": "27498", - "subject_kind": "pr", - "surface_hints": [ - "app_server_protocol", - "config_hooks", - "sandbox_permissions", - "tests_ci" - ], - "title": "Route image extension reads through turn environments v2", - "url": "https://github.com/openai/codex/pull/27498" - }, - { - "attention_flags": [ - "auth_account", - "breaking_change", - "deprecated_removed", - "new_feature", - "protocol_change", "release_packaging", "security_policy" ], - "changed_file_count": 98, + "changed_file_count": 2, "commit_shas": [ - "9aba4e7c68322efaf4a930336061dc4ddf22eedb", - "4df5f02d73bd57c728ec65880b2b702825256edc" + "cb142c49ffb7b172a9da1e75854b8e5c0618715d", + "8050d6acbd3f4849f23abe51020d1670f4fb8226", + "b1d8c54465e9bf2a28dd8f845d8abd3949761b09" ], - "committed_at": "2026-06-12T01:16:39Z", + "committed_at": "2026-06-12T17:21:00Z", "next_step": "ai_review_required", - "pr_number": 27475, - "pr_url": "https://github.com/openai/codex/pull/27475", + "pr_number": 27901, + "pr_url": "https://github.com/openai/codex/pull/27901", "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 deprecated_removed, release_packaging, security_policy.", "sample_paths": [ - "MODULE.bazel.lock", - "codex-rs/Cargo.lock", - "codex-rs/Cargo.toml", - "codex-rs/agent-graph-store/Cargo.toml", - "codex-rs/agent-graph-store/src/local.rs", - "codex-rs/agent-graph-store/src/store.rs", - "codex-rs/app-server/Cargo.toml", - "codex-rs/app-server/src/mcp_refresh.rs", - "codex-rs/app-server/src/message_processor.rs", - "codex-rs/async-utils/Cargo.toml", - "codex-rs/async-utils/src/lib.rs", - "codex-rs/cloud-tasks-client/Cargo.toml" + "sdk/python/pyproject.toml", + "sdk/python/tests/test_artifact_workflow_and_binaries.py" ], "source_state": "merged", - "subject_id": "27475", + "subject_id": "27901", "subject_kind": "pr", "surface_hints": [ - "app_server_protocol", - "auth_accounts", - "cli_tui", "config_hooks", - "mcp_plugins", - "model_provider", - "sandbox_permissions", "tests_ci" ], - "title": "[codex] Remove async_trait from first-party code", - "url": "https://github.com/openai/codex/pull/27475" + "title": "Use uv as Python SDK build backend", + "url": "https://github.com/openai/codex/pull/27901" }, { "attention_flags": [ "auth_account", "breaking_change", - "deprecated_removed", "new_feature", "protocol_change", "release_packaging", "security_policy" ], - "changed_file_count": 33, + "changed_file_count": 22, "commit_shas": [ - "c1c83d3db1c92450ee5104637673da205c3b53f1", - "11b7a3193c9c0b607a89154d613bf31bf9968356", - "37c9a1af8e791b935a7e6b79412097349b3be23a", - "2ccf773428b3e45ea0bf628f7cdc1f829acb4ec6", - "89e994bf64ee35e3e03915cea760486b67eeeddb", - "f06ad42c1964a93de5e96576e7c4244ac41f2e74", - "751a2a5ffa1105ebf86c0c89507d97b1dd8a203e", - "5d46286a8c47f23d546e431d8395861091407ac3", - "51201c3539709dc098c33bb5d917c3f3c2c360d1", - "51c0ede50280cb2b7720ad4edc795b99f2bbff8b", - "5957b62fc0479ae8ab34b1126edbfc482536d7a1", - "38fa3a8ac4472cf91ae78a7bcf46de916d96849a", - "6d519c7361e8c5d9ea93acd5a9ee2bdf8b52d76e", - "ffc649de3e5b2fb406e8fc84b26973bf375762ab", - "d4c46df25f4a90a7cb75380379d58bb301bcb9af", - "e34ec2789518918e9cd1d8b06187ce1da043b5b5" - ], - "committed_at": "2026-06-12T04:28:52Z", + "37efa545e8004b930a496c91c10ccc860937c29d", + "efd9be5adb25da27764e9e5a2221d14356ce7838", + "44dee73a25a44376823a6c3015779f6c476d47af", + "ebad839a70f8719b40fa78586fc4fa5f5e130e4b", + "3a9e2d6f25149e2b2e3fe707ce682b211c007349", + "c8f27780ed88df644693301f7fb79c661a6995d4", + "66a18813f2cded55678c34de157ca9143f8a432b", + "fa3b65a7e43afac7a10f8c052539b133f2d6dd1f" + ], + "committed_at": "2026-06-12T18:11:13Z", "next_step": "ai_review_required", - "pr_number": 27445, - "pr_url": "https://github.com/openai/codex/pull/27445", + "pr_number": 27720, + "pr_url": "https://github.com/openai/codex/pull/27720", "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, breaking_change, new_feature, protocol_change, release_packaging, security_policy.", "sample_paths": [ - "codex-rs/app-server-daemon/src/backend/pid.rs", - "codex-rs/app-server-daemon/src/backend/pid_tests.rs", - "codex-rs/app-server-daemon/src/lib.rs", - "codex-rs/app-server-daemon/src/remote_control_client.rs", "codex-rs/app-server-protocol/schema/json/ClientRequest.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/typescript/v2/RemoteControlDisableParams.ts", - "codex-rs/app-server-protocol/schema/typescript/v2/RemoteControlEnableParams.ts", - "codex-rs/app-server-protocol/schema/typescript/v2/index.ts", + "codex-rs/app-server-protocol/schema/typescript/RealtimeConversationArchitecture.ts", + "codex-rs/app-server-protocol/schema/typescript/index.ts", "codex-rs/app-server-protocol/src/protocol/common.rs", - "codex-rs/app-server-protocol/src/protocol/v2/remote_control.rs" - ], - "source_state": "merged", - "subject_id": "27445", - "subject_kind": "pr", - "surface_hints": [ - "app_server_protocol", - "cli_tui", - "docs_examples", - "tests_ci" - ], - "title": "feat(app-server): persist remote-control desired state", - "url": "https://github.com/openai/codex/pull/27445" - }, - { - "attention_flags": [ - "auth_account", - "deprecated_removed", - "new_feature", - "protocol_change", - "release_packaging", - "security_policy" - ], - "changed_file_count": 17, - "commit_shas": [ - "7fcf243caa6f8834c1d88fa7daddff28463424df", - "d4f8529190f9b4d4e9f527fd821038fa74332811", - "45674d25fca290b2193f147166e39231c6176072", - "bbc613c1dca65fa1b2c575eb83a2f90098a545cc", - "f2b7e7007a7077a2933627a690c3028b618cd2ff", - "e1d67f06b9abefe67d33231520aed075ed7731d7", - "a98925967179e545884a561f56321a4e905bd13a", - "62dbad3c1de1174856546c5cb62e798b18d2c58a", - "4075df843ae6e07aaba605a9c2139907f1160ab4", - "2cfb435d0e8a46aa536ece31817556832b344f82", - "71637bace336f2cad7f405e88a04841813767c8c", - "7d0addee9861574ed5f3dd7bc6e8b123ed9fed69", - "45e35b1147a70a06c3701933b636421ede421443", - "e2bae8628968b7f7e8e69d3117849c6397f64645", - "d68efcaa2e2bc4219129d4ad8589e7b34cb67270" - ], - "committed_at": "2026-06-12T05:26:31Z", - "next_step": "ai_review_required", - "pr_number": 27508, - "pr_url": "https://github.com/openai/codex/pull/27508", - "review_priority": "critical", - "review_reason": "Needs AI review for auth_account, deprecated_removed, new_feature, protocol_change, release_packaging, security_policy.", - "sample_paths": [ - "codex-rs/app-server-client/src/lib.rs", - "codex-rs/app-server-client/src/path.rs", - "codex-rs/app-server-client/src/remote.rs", - "codex-rs/tui/src/app/tests.rs", - "codex-rs/tui/src/app/thread_goal_actions.rs", - "codex-rs/tui/src/app_server_session.rs", - "codex-rs/tui/src/app_server_session/fs.rs", - "codex-rs/tui/src/bottom_pane/mod.rs", - "codex-rs/tui/src/chatwidget.rs", - "codex-rs/tui/src/chatwidget/goal_validation.rs", - "codex-rs/tui/src/chatwidget/slash_dispatch.rs", - "codex-rs/tui/src/chatwidget/tests.rs" + "codex-rs/app-server-protocol/src/protocol/v2/realtime.rs", + "codex-rs/app-server/src/request_processors/turn_processor.rs", + "codex-rs/app-server/tests/suite/v2/experimental_api.rs", + "codex-rs/app-server/tests/suite/v2/realtime_conversation.rs", + "codex-rs/codex-api/src/endpoint/realtime_call.rs", + "codex-rs/config/src/config_toml.rs" ], "source_state": "merged", - "subject_id": "27508", + "subject_id": "27720", "subject_kind": "pr", "surface_hints": [ "app_server_protocol", "cli_tui", + "config_hooks", "tests_ci" ], - "title": "[1 of 3] Support long raw TUI goal objectives", - "url": "https://github.com/openai/codex/pull/27508" + "title": "realtime: add AVAS architecture override", + "url": "https://github.com/openai/codex/pull/27720" }, { "attention_flags": [ "auth_account", "breaking_change", - "new_feature", - "protocol_change", - "security_policy" - ], - "changed_file_count": 25, - "commit_shas": [ - "1c776a78980457d4c7300b47af0b3565bf5218ce", - "a2a6c6f2e513d21dec6b385d0e386212a257b5f8", - "ba0f8c7bd1cdc11d3706b368a9071abc3caebd43" - ], - "committed_at": "2026-06-12T05:30:41Z", - "next_step": "ai_review_required", - "pr_number": 27256, - "pr_url": "https://github.com/openai/codex/pull/27256", - "review_priority": "critical", - "review_reason": "Needs AI review for auth_account, breaking_change, new_feature, protocol_change, security_policy.", - "sample_paths": [ - "codex-rs/app-server-client/src/lib.rs", - "codex-rs/app-server-protocol/schema/json/ServerRequest.json", - "codex-rs/app-server-protocol/schema/json/ToolRequestUserInputParams.json", - "codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.schemas.json", - "codex-rs/app-server-protocol/schema/typescript/v2/ToolRequestUserInputParams.ts", - "codex-rs/app-server-protocol/src/protocol/v2/item.rs", - "codex-rs/app-server/src/bespoke_event_handling.rs", - "codex-rs/app-server/src/outgoing_message.rs", - "codex-rs/app-server/src/request_processors/thread_processor_tests.rs", - "codex-rs/app-server/tests/suite/v2/request_user_input.rs", - "codex-rs/core/src/codex_delegate.rs", - "codex-rs/core/src/codex_delegate_tests.rs" - ], - "source_state": "merged", - "subject_id": "27256", - "subject_kind": "pr", - "surface_hints": [ - "app_server_protocol", - "cli_tui", - "mcp_plugins", - "tests_ci" - ], - "title": "Add request_user_input auto-resolution window contract", - "url": "https://github.com/openai/codex/pull/27256" - }, - { - "attention_flags": [ - "auth_account", "deprecated_removed", "new_feature", "protocol_change", "release_packaging", "security_policy" ], - "changed_file_count": 19, + "changed_file_count": 40, "commit_shas": [ - "b371fc20b8ff9939400ad984ffc899285ec08811", - "7f78a47e466d319886fe85ffbb49c5aa5fd4c705", - "79d913b81e08e954455b55b347568f8147cc0880" + "69a5b897facddfdb48dc4cccb173541f5349aa6f", + "db68524fe5280a98ae8a500448d2c7eb46b33164", + "a57dab38147d453e05cd391eed4a3ab83a251f71" ], - "committed_at": "2026-06-12T05:37:26Z", + "committed_at": "2026-06-12T18:38:01Z", "next_step": "ai_review_required", - "pr_number": 27724, - "pr_url": "https://github.com/openai/codex/pull/27724", + "pr_number": 27816, + "pr_url": "https://github.com/openai/codex/pull/27816", "review_priority": "critical", - "review_reason": "Needs AI review for auth_account, deprecated_removed, 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": [ "codex-rs/Cargo.lock", - "codex-rs/Cargo.toml", - "codex-rs/code-mode-host/BUILD.bazel", - "codex-rs/code-mode-host/Cargo.toml", - "codex-rs/code-mode-host/src/main.rs", - "codex-rs/code-mode-protocol/BUILD.bazel", - "codex-rs/code-mode-protocol/Cargo.toml", - "codex-rs/code-mode-protocol/src/description.rs", - "codex-rs/code-mode-protocol/src/lib.rs", - "codex-rs/code-mode-protocol/src/response.rs", - "codex-rs/code-mode-protocol/src/runtime.rs", - "codex-rs/code-mode-protocol/src/session.rs" - ], - "source_state": "merged", - "subject_id": "27724", - "subject_kind": "pr", - "surface_hints": [ - "app_server_protocol", - "config_hooks", - "tests_ci" - ], - "title": "code-mode standalone: extract protocol and add host crate", - "url": "https://github.com/openai/codex/pull/27724" - }, - { - "attention_flags": [ - "deprecated_removed", - "new_feature", - "protocol_change", - "security_policy" - ], - "changed_file_count": 4, - "commit_shas": [ - "763e8b940bc7d2f1469a25580295cf4c3bc71c85", - "f87021864074363a282c1937081588060ed8a1e7", - "b99bf9064e35c399d35860b720897ab266b26acc", - "e1ca683c9e5f52952bc13b4de8b55673e1baeb1c" - ], - "committed_at": "2026-06-12T06:23:44Z", - "next_step": "ai_review_required", - "pr_number": 27316, - "pr_url": "https://github.com/openai/codex/pull/27316", - "review_priority": "critical", - "review_reason": "Needs AI review for deprecated_removed, new_feature, protocol_change, security_policy.", - "sample_paths": [ - "codex-rs/core/src/tools/spec_plan.rs", - "codex-rs/core/src/tools/spec_plan_tests.rs", - "codex-rs/core/tests/suite/code_mode.rs", - "codex-rs/core/tests/suite/model_runtime_selectors.rs" - ], - "source_state": "merged", - "subject_id": "27316", - "subject_kind": "pr", - "surface_hints": [ - "model_provider", - "tests_ci" - ], - "title": "Keep request_user_input direct-model only", - "url": "https://github.com/openai/codex/pull/27316" - }, - { - "attention_flags": [ - "deprecated_removed", - "new_feature", - "protocol_change", - "release_packaging", - "security_policy" - ], - "changed_file_count": 15, - "commit_shas": [ - "bf7e046ef92cb66b11b5faad365f8fedf520e9a2", - "e4108a61e2c2202a3a023096d72e4b074eeea3f6", - "983e59bc4856168134a51bd61995848e0658e8a2", - "7349490148f4733f12d8a697cd0ca707125465ca", - "1d0be482e805f3da625b0463d497284658fbc1d1", - "a1acbe077be0ae8fb76ff52b597130bcc12fd15c", - "0cf644af40f76ffdfbac134b4b17aca78e8dcef5", - "bccf6b711e49e37f8bf1206853220c35f57b791a", - "385ae2e47da93cacbac76716b2a7338f96bb2353", - "22167d0053fc4a0446c9936e43efd042a0747e97", - "04393ff90d514aaf44ff0cf78454a1e2bbd05c94", - "6fdb655aab0160caa3d3144532f1ad65dc8deaec", - "6f9903d25d05b2ec36edff1084deb4766452d219", - "ba1b107d83e3d545436341b2451edb70fbeb096e", - "a4eb618a780b20e6d9ee2dd61cf880fe26019c4d", - "7d151cc5f3374795198fdcdabcde795e36e737d6", - "509459c428b5c3cf3ddffa281439330d2c71c0ce" - ], - "committed_at": "2026-06-12T07:10:06Z", - "next_step": "ai_review_required", - "pr_number": 27696, - "pr_url": "https://github.com/openai/codex/pull/27696", - "review_priority": "critical", - "review_reason": "Needs AI review for deprecated_removed, new_feature, protocol_change, release_packaging, security_policy.", - "sample_paths": [ "codex-rs/core/src/agents_md.rs", "codex-rs/core/src/agents_md_tests.rs", - "codex-rs/core/src/context/contextual_user_message_tests.rs", - "codex-rs/core/src/context/user_instructions.rs", + "codex-rs/core/src/context/environment_context.rs", "codex-rs/core/src/environment_selection.rs", - "codex-rs/core/src/session/mod.rs", - "codex-rs/core/src/session/turn_context.rs", - "codex-rs/core/src/thread_manager_tests.rs", - "codex-rs/core/tests/common/context_snapshot.rs", - "codex-rs/core/tests/suite/agents_md.rs", - "codex-rs/core/tests/suite/client.rs", - "codex-rs/core/tests/suite/compact.rs" - ], - "source_state": "merged", - "subject_id": "27696", - "subject_kind": "pr", - "surface_hints": [ - "cli_tui", - "model_provider", - "tests_ci" - ], - "title": "[codex] Load AGENTS.md from all bound environments", - "url": "https://github.com/openai/codex/pull/27696" - }, - { - "attention_flags": [ - "auth_account", - "deprecated_removed", - "new_feature", - "protocol_change", - "release_packaging", - "security_policy" - ], - "changed_file_count": 18, - "commit_shas": [ - "79e15b02010c0cd19abff8b1cd8bee134cc9590e", - "f8256a5751a0963dbd38b1afbe082cfb1aae3d3d" - ], - "committed_at": "2026-06-12T09:20:34Z", - "next_step": "ai_review_required", - "pr_number": 27670, - "pr_url": "https://github.com/openai/codex/pull/27670", - "review_priority": "critical", - "review_reason": "Needs AI review for auth_account, deprecated_removed, new_feature, protocol_change, release_packaging, security_policy.", - "sample_paths": [ - "codex-rs/app-server/src/mcp_refresh.rs", - "codex-rs/app-server/src/request_processors/mcp_processor.rs", - "codex-rs/core/src/codex_thread.rs", - "codex-rs/core/src/mcp.rs", - "codex-rs/core/src/mcp_skill_dependencies.rs", + "codex-rs/core/src/exec.rs", + "codex-rs/core/src/guardian/review_session.rs", + "codex-rs/core/src/sandboxing/mod.rs", "codex-rs/core/src/session/mcp.rs", - "codex-rs/core/src/session/mod.rs", "codex-rs/core/src/session/session.rs", "codex-rs/core/src/session/tests.rs", - "codex-rs/core/src/state/service.rs", - "codex-rs/core/src/thread_manager_tests.rs", - "codex-rs/ext/extension-api/src/contributors.rs" + "codex-rs/core/src/session/turn.rs" ], "source_state": "merged", - "subject_id": "27670", + "subject_id": "27816", "subject_kind": "pr", "surface_hints": [ "app_server_protocol", + "config_hooks", "mcp_plugins", + "sandbox_permissions", "tests_ci" ], - "title": "Make MCP server contributions thread-scoped", - "url": "https://github.com/openai/codex/pull/27670" + "title": "sandboxing: migrate cwd inputs to PathUri", + "url": "https://github.com/openai/codex/pull/27816" }, { "attention_flags": [ "auth_account", - "breaking_change", "deprecated_removed", "new_feature", "protocol_change", - "release_packaging", - "security_policy" + "release_packaging" ], - "changed_file_count": 13, + "changed_file_count": 11, "commit_shas": [ - "8b4a7e0b207750361b267e156596e508fcae4dea", - "8a69762b3a6353fc243440ae33dfcac0dbbe541a" + "79e6ea4a8182b747e0329082a2b70215a70253b3", + "f63cf1908952d8daed71bcdb63efda76bfa15ef2" ], - "committed_at": "2026-06-12T11:37:33Z", + "committed_at": "2026-06-12T18:53:55Z", "next_step": "ai_review_required", - "pr_number": 27692, - "pr_url": "https://github.com/openai/codex/pull/27692", + "pr_number": 27890, + "pr_url": "https://github.com/openai/codex/pull/27890", "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, new_feature, protocol_change, release_packaging.", "sample_paths": [ - "codex-rs/Cargo.lock", - "codex-rs/core-plugins/Cargo.toml", - "codex-rs/core-plugins/src/lib.rs", - "codex-rs/core-plugins/src/manifest.rs", - "codex-rs/core-plugins/src/provider.rs", - "codex-rs/core-plugins/src/provider_tests.rs", - "codex-rs/plugin/Cargo.toml", - "codex-rs/plugin/src/lib.rs", - "codex-rs/plugin/src/manifest.rs", - "codex-rs/plugin/src/provider.rs", - "codex-rs/plugin/src/provider_tests.rs", - "codex-rs/utils/plugins/src/lib.rs" + "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/PluginReadResponse.json", + "codex-rs/app-server-protocol/schema/typescript/v2/PluginDetail.ts", + "codex-rs/app-server-protocol/src/protocol/v2/plugin.rs", + "codex-rs/app-server/README.md", + "codex-rs/app-server/src/request_processors/plugins.rs", + "codex-rs/app-server/tests/suite/v2/plugin_read.rs", + "codex-rs/core-plugins/src/remote.rs", + "codex-rs/tui/src/chatwidget/tests/helpers.rs", + "codex-rs/tui/src/chatwidget/tests/popups_and_settings.rs" ], "source_state": "merged", - "subject_id": "27692", + "subject_id": "27890", "subject_kind": "pr", "surface_hints": [ + "app_server_protocol", + "cli_tui", "config_hooks", + "docs_examples", + "mcp_plugins", "tests_ci" ], - "title": "code-mode standalone: extract protocol and add host crate", - "url": "https://github.com/openai/codex/pull/27724" + "title": "[codex] expose remote plugin share URL", + "url": "https://github.com/openai/codex/pull/27890" }, { "attention_flags": [ + "auth_account", "deprecated_removed", "new_feature", "protocol_change", "security_policy" ], - "changed_file_count": 4, + "changed_file_count": 11, "commit_shas": [ - "763e8b940bc7d2f1469a25580295cf4c3bc71c85", - "f87021864074363a282c1937081588060ed8a1e7", - "b99bf9064e35c399d35860b720897ab266b26acc", - "e1ca683c9e5f52952bc13b4de8b55673e1baeb1c" + "138e4eeeeaaeed2d04a74283e13e30124a75bcd1", + "d4e267882417929bfa34d49398f7043f95cddc3c" ], - "committed_at": "2026-06-12T06:23:44Z", + "committed_at": "2026-06-12T19:12:08Z", "next_step": "ai_review_required", - "pr_number": 27316, - "pr_url": "https://github.com/openai/codex/pull/27316", + "pr_number": 27927, + "pr_url": "https://github.com/openai/codex/pull/27927", "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, deprecated_removed, new_feature, protocol_change, security_policy.", "sample_paths": [ - "codex-rs/core/src/tools/spec_plan.rs", - "codex-rs/core/src/tools/spec_plan_tests.rs", - "codex-rs/core/tests/suite/code_mode.rs", - "codex-rs/core/tests/suite/model_runtime_selectors.rs" + "codex-rs/core-plugins/src/provider_tests.rs", + "codex-rs/exec-server/src/fs_helper.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/tests/file_system/shared.rs", + "codex-rs/exec-server/tests/file_system_unix.rs", + "codex-rs/ext/skills/tests/executor_file_system_authority.rs", + "codex-rs/file-system/src/lib.rs" ], "source_state": "merged", - "subject_id": "27316", + "subject_id": "27927", "subject_kind": "pr", "surface_hints": [ + "app_server_protocol", + "auth_accounts", + "mcp_plugins", "model_provider", + "sandbox_permissions", "tests_ci" ], - "title": "Add executor-owned plugin resolution", - "url": "https://github.com/openai/codex/pull/27692" + "title": "[codex] Add size to internal filesystem metadata", + "url": "https://github.com/openai/codex/pull/27927" }, { "attention_flags": [ "auth_account", "breaking_change", + "deprecated_removed", "new_feature", "protocol_change", - "release_packaging", "security_policy" ], - "changed_file_count": 7, + "changed_file_count": 8, "commit_shas": [ - "4157b14280055a67c0374686229f49add9c24c2a", - "2c491faf478bebfa1a7d9333dd8cc4cf66ec5591" + "07d66eccd904cd15cd754c43d3f74a72d63a1980", + "3e3379b56006b9e877f5db4ba65009b4ad41c49c" ], - "committed_at": "2026-06-12T13:10:05Z", + "committed_at": "2026-06-12T19:15:21Z", "next_step": "ai_review_required", - "pr_number": 27863, - "pr_url": "https://github.com/openai/codex/pull/27863", + "pr_number": 27504, + "pr_url": "https://github.com/openai/codex/pull/27504", "review_priority": "critical", - "review_reason": "Needs AI review for auth_account, 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/codex-mcp/src/lib.rs", - "codex-rs/codex-mcp/src/plugin_config.rs", - "codex-rs/codex-mcp/src/plugin_config_tests.rs", - "codex-rs/core-plugins/Cargo.toml", - "codex-rs/core-plugins/src/loader.rs", - "codex-rs/core-plugins/src/loader_tests.rs" + "codex-rs/config/src/types.rs", + "codex-rs/core/config.schema.json", + "codex-rs/core/src/config/auth_keyring.rs", + "codex-rs/core/src/config/auth_keyring_tests.rs", + "codex-rs/core/src/config/config_tests.rs", + "codex-rs/core/src/config/mod.rs", + "codex-rs/features/src/lib.rs", + "codex-rs/features/src/tests.rs" ], "source_state": "merged", - "subject_id": "27863", + "subject_id": "27504", "subject_kind": "pr", "surface_hints": [ + "auth_accounts", "config_hooks", - "mcp_plugins", "tests_ci" ], - "title": "Extract shared plugin MCP config parsing", - "url": "https://github.com/openai/codex/pull/27863" + "title": "feat: add secret auth storage configuration", + "url": "https://github.com/openai/codex/pull/27504" }, { "attention_flags": [ "auth_account", - "breaking_change", + "deprecated_removed", "new_feature", - "protocol_change" + "protocol_change", + "security_policy" ], - "changed_file_count": 13, + "changed_file_count": 9, "commit_shas": [ - "c21e3e96455cdee04da62579c680de6b4bbffe8d" + "bfd992f6dbf9acffcbdafbcee3c092d729725759", + "94185dff59cd43d21450db876ab4b595383ae959", + "f45d36dc66dfe7eba7478c6921a69ced53a92c07", + "21c45654a19f658a83b37ada768ab8e109f06955" ], - "committed_at": "2026-06-12T14:19:17Z", + "committed_at": "2026-06-12T19:38:30Z", "next_step": "ai_review_required", - "pr_number": 27703, - "pr_url": "https://github.com/openai/codex/pull/27703", + "pr_number": 27674, + "pr_url": "https://github.com/openai/codex/pull/27674", "review_priority": "critical", - "review_reason": "Needs AI review for auth_account, breaking_change, new_feature, protocol_change.", + "review_reason": "Needs AI review for auth_account, deprecated_removed, new_feature, protocol_change, security_policy.", "sample_paths": [ - "codex-rs/tui/src/app_event.rs", - "codex-rs/tui/src/app_server_session.rs", - "codex-rs/tui/src/external_agent_config_migration.rs", - "codex-rs/tui/src/external_agent_config_migration/render.rs", - "codex-rs/tui/src/external_agent_config_migration_flow.rs", - "codex-rs/tui/src/slash_command.rs", - "codex-rs/tui/src/snapshots/codex_tui__external_agent_config_migration__tests__external_agent_config_migration_customize.snap", - "codex-rs/tui/src/snapshots/codex_tui__external_agent_config_migration__tests__external_agent_config_migration_customize_action.snap", - "codex-rs/tui/src/snapshots/codex_tui__external_agent_config_migration__tests__external_agent_config_migration_customize_action_windows.snap", - "codex-rs/tui/src/snapshots/codex_tui__external_agent_config_migration__tests__external_agent_config_migration_customize_windows.snap", - "codex-rs/tui/src/snapshots/codex_tui__external_agent_config_migration__tests__external_agent_config_migration_prompt.snap", - "codex-rs/tui/src/snapshots/codex_tui__external_agent_config_migration__tests__external_agent_config_migration_prompt_windows.snap" + "codex-rs/Cargo.lock", + "codex-rs/cli/Cargo.toml", + "codex-rs/cli/src/login.rs", + "codex-rs/cli/tests/login.rs", + "codex-rs/login/src/auth/manager.rs", + "codex-rs/login/src/auth/mod.rs", + "codex-rs/login/src/auth/revoke.rs", + "codex-rs/login/src/server.rs", + "codex-rs/login/tests/suite/logout.rs" ], "source_state": "merged", - "subject_id": "27703", + "subject_id": "27674", "subject_kind": "pr", "surface_hints": [ - "app_server_protocol", + "auth_accounts", "cli_tui", "config_hooks", "tests_ci" ], - "title": "[codex] restore source-specific import copy", - "url": "https://github.com/openai/codex/pull/27703" + "title": "[login] revoke existing auth before starting login", + "url": "https://github.com/openai/codex/pull/27674" }, { "attention_flags": [ "auth_account", + "breaking_change", "deprecated_removed", - "protocol_change" - ], - "changed_file_count": 2, - "commit_shas": [ - "7192731641fdaf92db6c3325456c311db1e1fbe8" - ], - "committed_at": "2026-06-12T14:24:08Z", - "next_step": "ai_review_required", - "pr_number": 27879, - "pr_url": "https://github.com/openai/codex/pull/27879", - "review_priority": "critical", - "review_reason": "Needs AI review for auth_account, deprecated_removed, protocol_change.", - "sample_paths": [ - "codex-rs/login/src/auth/auth_tests.rs", - "codex-rs/login/src/auth/bedrock_api_key_tests.rs" - ], - "source_state": "merged", - "subject_id": "27879", - "subject_kind": "pr", - "surface_hints": [ - "auth_accounts", - "tests_ci" - ], - "title": "fix: serialize auth environment tests", - "url": "https://github.com/openai/codex/pull/27879" - }, - { - "attention_flags": [ - "deprecated_removed", + "new_feature", + "protocol_change", "release_packaging", "security_policy" ], - "changed_file_count": 2, + "changed_file_count": 11, "commit_shas": [ - "cb142c49ffb7b172a9da1e75854b8e5c0618715d", - "8050d6acbd3f4849f23abe51020d1670f4fb8226", - "b1d8c54465e9bf2a28dd8f845d8abd3949761b09" + "07d66eccd904cd15cd754c43d3f74a72d63a1980", + "3e3379b56006b9e877f5db4ba65009b4ad41c49c", + "e026ff2133ba7c2e740eee1ecf0cc0ec5a7479a8", + "30f6722a49e562b8d8fccbaf221aa278d39ab30c" ], - "committed_at": "2026-06-12T17:21:00Z", + "committed_at": "2026-06-12T19:52:49Z", "next_step": "ai_review_required", - "pr_number": 27901, - "pr_url": "https://github.com/openai/codex/pull/27901", + "pr_number": 27535, + "pr_url": "https://github.com/openai/codex/pull/27535", "review_priority": "critical", - "review_reason": "Needs AI review for deprecated_removed, 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": [ - "sdk/python/pyproject.toml", - "sdk/python/tests/test_artifact_workflow_and_binaries.py" + "codex-rs/config/src/types.rs", + "codex-rs/core/config.schema.json", + "codex-rs/core/src/config/auth_keyring.rs", + "codex-rs/core/src/config/auth_keyring_tests.rs", + "codex-rs/core/src/config/config_tests.rs", + "codex-rs/core/src/config/mod.rs", + "codex-rs/features/src/lib.rs", + "codex-rs/features/src/tests.rs", + "codex-rs/keyring-store/src/lib.rs", + "codex-rs/secrets/src/lib.rs", + "codex-rs/secrets/src/local.rs" ], "source_state": "merged", - "subject_id": "27901", + "subject_id": "27535", "subject_kind": "pr", "surface_hints": [ + "auth_accounts", "config_hooks", "tests_ci" ], - "title": "Use uv as Python SDK build backend", - "url": "https://github.com/openai/codex/pull/27901" + "title": "feat: add auth-specific encrypted secret namespaces", + "url": "https://github.com/openai/codex/pull/27535" }, { "attention_flags": [ - "auth_account", - "breaking_change", - "new_feature", - "protocol_change", - "release_packaging", - "security_policy" + "deprecated_removed", + "new_feature" ], - "changed_file_count": 22, + "changed_file_count": 3, "commit_shas": [ - "37efa545e8004b930a496c91c10ccc860937c29d", - "efd9be5adb25da27764e9e5a2221d14356ce7838", - "44dee73a25a44376823a6c3015779f6c476d47af", - "ebad839a70f8719b40fa78586fc4fa5f5e130e4b", - "3a9e2d6f25149e2b2e3fe707ce682b211c007349", - "c8f27780ed88df644693301f7fb79c661a6995d4", - "66a18813f2cded55678c34de157ca9143f8a432b", - "fa3b65a7e43afac7a10f8c052539b133f2d6dd1f" + "cb38dc5b975c922567a770237080cb3c1047e407" ], - "committed_at": "2026-06-12T18:11:13Z", + "committed_at": "2026-06-12T20:31:11Z", "next_step": "ai_review_required", - "pr_number": 27720, - "pr_url": "https://github.com/openai/codex/pull/27720", + "pr_number": 23254, + "pr_url": "https://github.com/openai/codex/pull/23254", "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 deprecated_removed, new_feature.", "sample_paths": [ - "codex-rs/app-server-protocol/schema/json/ClientRequest.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/typescript/RealtimeConversationArchitecture.ts", - "codex-rs/app-server-protocol/schema/typescript/index.ts", - "codex-rs/app-server-protocol/src/protocol/common.rs", - "codex-rs/app-server-protocol/src/protocol/v2/realtime.rs", - "codex-rs/app-server/src/request_processors/turn_processor.rs", - "codex-rs/app-server/tests/suite/v2/experimental_api.rs", - "codex-rs/app-server/tests/suite/v2/realtime_conversation.rs", - "codex-rs/codex-api/src/endpoint/realtime_call.rs", - "codex-rs/config/src/config_toml.rs" + "codex-rs/core/src/context/available_plugins_instructions.rs", + "codex-rs/core/src/plugins/render_tests.rs", + "codex-rs/core/tests/suite/plugins.rs" ], "source_state": "merged", - "subject_id": "27720", + "subject_id": "23254", "subject_kind": "pr", "surface_hints": [ - "app_server_protocol", - "cli_tui", - "config_hooks", + "mcp_plugins", "tests_ci" ], - "title": "realtime: add AVAS architecture override", - "url": "https://github.com/openai/codex/pull/27720" + "title": "fix(plugins) rm plugin descriptions", + "url": "https://github.com/openai/codex/pull/23254" }, { "attention_flags": [ @@ -794,94 +410,103 @@ "breaking_change", "deprecated_removed", "new_feature", - "protocol_change", - "release_packaging", - "security_policy" - ], - "changed_file_count": 40, - "commit_shas": [ - "69a5b897facddfdb48dc4cccb173541f5349aa6f", - "db68524fe5280a98ae8a500448d2c7eb46b33164", - "a57dab38147d453e05cd391eed4a3ab83a251f71" + "protocol_change" ], - "committed_at": "2026-06-12T18:38:01Z", + "changed_file_count": 44, + "commit_shas": [ + "175e330c022da6cb1b49d20351464a8e99b77d29", + "dea1baa7a97b7a072a00dadb87d54bce4858dade", + "73dde0c84f6cf2da38ec71a094b6c7a6282bf645", + "e62505d9da1a30546003ca7af0ca25f67bbf502b", + "a1d47af3a817a03973e53d7eed6467660981651a", + "3d56c1105db26de4c47d7d0f890ddd6bc97f4f97", + "029c6755406e172c41d4eb8456f265054968983a", + "9a685d4cabb0fa6370135ef2737ed731d5759033" + ], + "committed_at": "2026-06-12T20:50:04Z", "next_step": "ai_review_required", - "pr_number": 27816, - "pr_url": "https://github.com/openai/codex/pull/27816", + "pr_number": 27830, + "pr_url": "https://github.com/openai/codex/pull/27830", "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, breaking_change, deprecated_removed, new_feature, protocol_change.", "sample_paths": [ - "codex-rs/Cargo.lock", - "codex-rs/core/src/agents_md.rs", - "codex-rs/core/src/agents_md_tests.rs", - "codex-rs/core/src/context/environment_context.rs", - "codex-rs/core/src/environment_selection.rs", - "codex-rs/core/src/exec.rs", - "codex-rs/core/src/guardian/review_session.rs", - "codex-rs/core/src/sandboxing/mod.rs", - "codex-rs/core/src/session/mcp.rs", - "codex-rs/core/src/session/session.rs", - "codex-rs/core/src/session/tests.rs", - "codex-rs/core/src/session/turn.rs" + "codex-rs/app-server-protocol/schema/json/ClientRequest.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/RawResponseItemCompletedNotification.json", + "codex-rs/app-server-protocol/schema/json/v2/ThreadResumeParams.json", + "codex-rs/app-server-protocol/schema/typescript/AgentMessageInputContent.ts", + "codex-rs/app-server-protocol/src/protocol/thread_history.rs", + "codex-rs/core/src/agent/control/spawn.rs", + "codex-rs/core/src/client_common.rs", + "codex-rs/core/src/guardian/prompt.rs", + "codex-rs/core/src/hook_runtime.rs", + "codex-rs/core/src/prompt_debug.rs" ], "source_state": "merged", - "subject_id": "27816", + "subject_id": "27830", "subject_kind": "pr", "surface_hints": [ "app_server_protocol", + "cli_tui", "config_hooks", - "mcp_plugins", + "model_provider", "sandbox_permissions", "tests_ci" ], - "title": "sandboxing: migrate cwd inputs to PathUri", - "url": "https://github.com/openai/codex/pull/27816" + "title": "Support plaintext agent messages", + "url": "https://github.com/openai/codex/pull/27830" }, { "attention_flags": [ - "auth_account", + "breaking_change", "deprecated_removed", "new_feature", "protocol_change", - "release_packaging" + "rate_limit", + "release_packaging", + "security_policy" ], - "changed_file_count": 11, + "changed_file_count": 37, "commit_shas": [ - "79e6ea4a8182b747e0329082a2b70215a70253b3", - "f63cf1908952d8daed71bcdb63efda76bfa15ef2" - ], - "committed_at": "2026-06-12T18:53:55Z", + "993987bfebdb801052b5204b7c6dc179345141d2", + "9d621c44ee7863a51b55a55d5cd9228c8344ec51", + "77fccf78513484a77c322498138121f5755b8d42", + "3731b0fad7bccf63361cc1f9f9cb8bde8e9cd7dc", + "d7cbab5392bff4ff61c2953b0e79b54520f9c69b", + "5381aad53113fd81732460dcce5627877c98e4c0" + ], + "committed_at": "2026-06-12T21:20:55Z", "next_step": "ai_review_required", - "pr_number": 27890, - "pr_url": "https://github.com/openai/codex/pull/27890", + "pr_number": 27801, + "pr_url": "https://github.com/openai/codex/pull/27801", "review_priority": "critical", - "review_reason": "Needs AI review for auth_account, deprecated_removed, new_feature, protocol_change, release_packaging.", + "review_reason": "Needs AI review for breaking_change, deprecated_removed, new_feature, protocol_change, rate_limit, release_packaging, security_policy.", "sample_paths": [ - "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/PluginReadResponse.json", - "codex-rs/app-server-protocol/schema/typescript/v2/PluginDetail.ts", - "codex-rs/app-server-protocol/src/protocol/v2/plugin.rs", - "codex-rs/app-server/README.md", - "codex-rs/app-server/src/request_processors/plugins.rs", - "codex-rs/app-server/tests/suite/v2/plugin_read.rs", - "codex-rs/core-plugins/src/remote.rs", - "codex-rs/tui/src/chatwidget/tests/helpers.rs", - "codex-rs/tui/src/chatwidget/tests/popups_and_settings.rs" + "MODULE.bazel.lock", + "codex-rs/Cargo.lock", + "codex-rs/Cargo.toml", + "codex-rs/tui/Cargo.toml", + "codex-rs/tui/src/app.rs", + "codex-rs/tui/src/app/event_dispatch.rs", + "codex-rs/tui/src/app/thread_routing.rs", + "codex-rs/tui/src/app_command.rs", + "codex-rs/tui/src/app_event.rs", + "codex-rs/tui/src/app_event_sender.rs", + "codex-rs/tui/src/app_server_session.rs", + "codex-rs/tui/src/audio_device.rs" ], "source_state": "merged", - "subject_id": "27890", + "subject_id": "27801", "subject_kind": "pr", "surface_hints": [ "app_server_protocol", "cli_tui", "config_hooks", - "docs_examples", - "mcp_plugins", "tests_ci" ], - "title": "[codex] expose remote plugin share URL", - "url": "https://github.com/openai/codex/pull/27890" + "title": "Remove TUI realtime voice support", + "url": "https://github.com/openai/codex/pull/27801" }, { "attention_flags": [ @@ -891,363 +516,431 @@ "protocol_change", "security_policy" ], - "changed_file_count": 11, + "changed_file_count": 37, "commit_shas": [ - "138e4eeeeaaeed2d04a74283e13e30124a75bcd1", - "d4e267882417929bfa34d49398f7043f95cddc3c" + "24a0cd4c2b9a14f672691335af172ce3462aeb79", + "77343b8909e8a8ef9c6b65476c547f8681eb1554", + "d43079bc45170d8d8abf051718a446a592728416", + "0dc3b430c878be6d9d5a7f19e72dd6567adc6933" ], - "committed_at": "2026-06-12T19:12:08Z", + "committed_at": "2026-06-12T21:23:50Z", "next_step": "ai_review_required", - "pr_number": 27927, - "pr_url": "https://github.com/openai/codex/pull/27927", + "pr_number": 27539, + "pr_url": "https://github.com/openai/codex/pull/27539", "review_priority": "critical", "review_reason": "Needs AI review for auth_account, deprecated_removed, new_feature, protocol_change, security_policy.", "sample_paths": [ - "codex-rs/core-plugins/src/provider_tests.rs", - "codex-rs/exec-server/src/fs_helper.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/tests/file_system/shared.rs", - "codex-rs/exec-server/tests/file_system_unix.rs", - "codex-rs/ext/skills/tests/executor_file_system_authority.rs", - "codex-rs/file-system/src/lib.rs" + "codex-rs/Cargo.lock", + "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/tests/pairing_tests.rs", + "codex-rs/app-server-transport/src/transport/remote_control/websocket.rs", + "codex-rs/app-server/src/request_processors/account_processor.rs", + "codex-rs/app-server/tests/common/auth_fixtures.rs", + "codex-rs/app-server/tests/suite/v2/account.rs", + "codex-rs/app-server/tests/suite/v2/app_list.rs", + "codex-rs/cli/src/doctor.rs", + "codex-rs/cli/src/login.rs", + "codex-rs/cloud-config/src/bundle_loader.rs" ], "source_state": "merged", - "subject_id": "27927", + "subject_id": "27539", "subject_kind": "pr", "surface_hints": [ "app_server_protocol", "auth_accounts", - "mcp_plugins", + "cli_tui", + "config_hooks", "model_provider", - "sandbox_permissions", "tests_ci" ], - "title": "[codex] Add size to internal filesystem metadata", - "url": "https://github.com/openai/codex/pull/27927" + "title": "feat: use encrypted local secrets for CLI auth", + "url": "https://github.com/openai/codex/pull/27539" }, { "attention_flags": [ "auth_account", "breaking_change", - "deprecated_removed", "new_feature", "protocol_change", "security_policy" ], - "changed_file_count": 8, + "changed_file_count": 27, "commit_shas": [ - "07d66eccd904cd15cd754c43d3f74a72d63a1980", - "3e3379b56006b9e877f5db4ba65009b4ad41c49c" + "bc08fad8d62d48b248a86b6183ebb1ecc44d786c", + "78daf298b0ea9ea7a5fddad51af4545cb05d2236" ], - "committed_at": "2026-06-12T19:15:21Z", + "committed_at": "2026-06-12T22:03:51Z", "next_step": "ai_review_required", - "pr_number": 27504, - "pr_url": "https://github.com/openai/codex/pull/27504", + "pr_number": 27541, + "pr_url": "https://github.com/openai/codex/pull/27541", "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/types.rs", - "codex-rs/core/config.schema.json", - "codex-rs/core/src/config/auth_keyring.rs", - "codex-rs/core/src/config/auth_keyring_tests.rs", - "codex-rs/core/src/config/config_tests.rs", - "codex-rs/core/src/config/mod.rs", - "codex-rs/features/src/lib.rs", - "codex-rs/features/src/tests.rs" + "codex-rs/Cargo.lock", + "codex-rs/app-server/src/mcp_refresh.rs", + "codex-rs/app-server/src/request_processors/mcp_processor.rs", + "codex-rs/app-server/src/request_processors/plugins.rs", + "codex-rs/cli/src/mcp_cmd.rs", + "codex-rs/codex-mcp/src/connection_manager.rs", + "codex-rs/codex-mcp/src/connection_manager_tests.rs", + "codex-rs/codex-mcp/src/mcp/auth.rs", + "codex-rs/codex-mcp/src/mcp/mod.rs", + "codex-rs/codex-mcp/src/mcp/mod_tests.rs", + "codex-rs/codex-mcp/src/rmcp_client.rs", + "codex-rs/core/src/config/mod.rs" ], "source_state": "merged", - "subject_id": "27504", + "subject_id": "27541", "subject_kind": "pr", "surface_hints": [ + "app_server_protocol", "auth_accounts", + "cli_tui", "config_hooks", + "mcp_plugins", "tests_ci" ], - "title": "feat: add secret auth storage configuration", - "url": "https://github.com/openai/codex/pull/27504" + "title": "feat: use encrypted local secrets for MCP OAuth", + "url": "https://github.com/openai/codex/pull/27541" }, { "attention_flags": [ "auth_account", - "deprecated_removed", + "breaking_change", "new_feature", "protocol_change", + "release_packaging", "security_policy" ], - "changed_file_count": 9, + "changed_file_count": 18, "commit_shas": [ - "bfd992f6dbf9acffcbdafbcee3c092d729725759", - "94185dff59cd43d21450db876ab4b595383ae959", - "f45d36dc66dfe7eba7478c6921a69ced53a92c07", - "21c45654a19f658a83b37ada768ab8e109f06955" + "728db43093fb3390778de642164be5520aa9262a" ], - "committed_at": "2026-06-12T19:38:30Z", + "committed_at": "2026-06-12T22:05:37Z", "next_step": "ai_review_required", - "pr_number": 27674, - "pr_url": "https://github.com/openai/codex/pull/27674", + "pr_number": 27936, + "pr_url": "https://github.com/openai/codex/pull/27936", "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, breaking_change, new_feature, protocol_change, release_packaging, security_policy.", "sample_paths": [ - "codex-rs/Cargo.lock", - "codex-rs/cli/Cargo.toml", - "codex-rs/cli/src/login.rs", - "codex-rs/cli/tests/login.rs", - "codex-rs/login/src/auth/manager.rs", - "codex-rs/login/src/auth/mod.rs", - "codex-rs/login/src/auth/revoke.rs", - "codex-rs/login/src/server.rs", - "codex-rs/login/tests/suite/logout.rs" + "codex-rs/app-server-protocol/schema/json/ClientRequest.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/typescript/ConversationTextRole.ts", + "codex-rs/app-server-protocol/schema/typescript/index.ts", + "codex-rs/app-server-protocol/src/protocol/v2/realtime.rs", + "codex-rs/app-server-protocol/src/protocol/v2/tests.rs", + "codex-rs/app-server/README.md", + "codex-rs/app-server/src/request_processors/turn_processor.rs", + "codex-rs/app-server/tests/suite/v2/realtime_conversation.rs", + "codex-rs/codex-api/src/endpoint/realtime_websocket/methods.rs", + "codex-rs/codex-api/src/endpoint/realtime_websocket/methods_common.rs" ], "source_state": "merged", - "subject_id": "27674", + "subject_id": "27936", "subject_kind": "pr", "surface_hints": [ - "auth_accounts", + "app_server_protocol", "cli_tui", - "config_hooks", + "docs_examples", "tests_ci" ], - "title": "[login] revoke existing auth before starting login", - "url": "https://github.com/openai/codex/pull/27674" + "title": "[codex] add roles to realtime append text", + "url": "https://github.com/openai/codex/pull/27936" }, { "attention_flags": [ "auth_account", - "breaking_change", "deprecated_removed", "new_feature", - "protocol_change", - "release_packaging", - "security_policy" + "protocol_change" ], - "changed_file_count": 11, + "changed_file_count": 8, "commit_shas": [ - "07d66eccd904cd15cd754c43d3f74a72d63a1980", - "3e3379b56006b9e877f5db4ba65009b4ad41c49c", - "e026ff2133ba7c2e740eee1ecf0cc0ec5a7479a8", - "30f6722a49e562b8d8fccbaf221aa278d39ab30c" - ], - "committed_at": "2026-06-12T19:52:49Z", + "b9aa83a325087256114abbf696bc4f1e2c48840a", + "e1af0c16d05d22b2ab34db103e8e5ab2abd75998", + "2a2d9c3bd9a79173ed02659dc2aa218ce10c30cf", + "16a8f5916f994ec3ed23290df8a4e54b148e24d1", + "5b08f9d725f7a629e9aa047e54e2941b04a44cb2", + "de336b350e5817be9a603c36a379977ea740e78e", + "c1855cd69674b2d747534dcf6f6d10a606101884" + ], + "committed_at": "2026-06-12T23:29:40Z", "next_step": "ai_review_required", - "pr_number": 27535, - "pr_url": "https://github.com/openai/codex/pull/27535", + "pr_number": 27499, + "pr_url": "https://github.com/openai/codex/pull/27499", "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, new_feature, protocol_change.", "sample_paths": [ - "codex-rs/config/src/types.rs", - "codex-rs/core/config.schema.json", - "codex-rs/core/src/config/auth_keyring.rs", - "codex-rs/core/src/config/auth_keyring_tests.rs", - "codex-rs/core/src/config/config_tests.rs", - "codex-rs/core/src/config/mod.rs", "codex-rs/features/src/lib.rs", "codex-rs/features/src/tests.rs", - "codex-rs/keyring-store/src/lib.rs", - "codex-rs/secrets/src/lib.rs", - "codex-rs/secrets/src/local.rs" + "codex-rs/tui/src/bottom_pane/chat_composer.rs", + "codex-rs/tui/src/bottom_pane/mentions_v2/mod.rs", + "codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__default_unified_mention_popup.snap", + "codex-rs/tui/src/chatwidget/skills.rs", + "codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__skills_menu_default_mentions_shortcut.snap", + "codex-rs/tui/src/chatwidget/tests/popups_and_settings.rs" ], "source_state": "merged", - "subject_id": "27535", + "subject_id": "27499", "subject_kind": "pr", "surface_hints": [ - "auth_accounts", + "cli_tui", "config_hooks", "tests_ci" ], - "title": "feat: add auth-specific encrypted secret namespaces", - "url": "https://github.com/openai/codex/pull/27535" + "title": "Promote TUI unified mentions in composer to default mentions feature", + "url": "https://github.com/openai/codex/pull/27499" }, { "attention_flags": [ + "breaking_change", + "deprecated_removed", "new_feature", - "protocol_change" + "protocol_change", + "security_policy" ], "changed_file_count": 4, "commit_shas": [ - "b4ea264a29f466200008303391c2b7f42c8747b1" + "bb55610111fe3fdbcbc954cab562a9985ef9f84c" ], - "committed_at": "2026-06-12T00:15:04Z", + "committed_at": "2026-06-12T23:37:14Z", "next_step": "ai_review_required", - "pr_number": 27619, - "pr_url": "https://github.com/openai/codex/pull/27619", - "review_priority": "high", - "review_reason": "Needs AI review for new_feature, protocol_change.", + "pr_number": 27972, + "pr_url": "https://github.com/openai/codex/pull/27972", + "review_priority": "critical", + "review_reason": "Needs AI review for breaking_change, deprecated_removed, new_feature, protocol_change, security_policy.", "sample_paths": [ - "codex-rs/tui/src/chatwidget/hook_lifecycle.rs", - "codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__completed_turn_clears_visible_running_hook.snap", - "codex-rs/tui/src/chatwidget/tests/status_and_layout.rs", - "codex-rs/tui/src/chatwidget/turn_runtime.rs" + "codex-rs/core/tests/suite/apply_patch_cli.rs", + "codex-rs/core/tests/suite/rmcp_client.rs", + "codex-rs/core/tests/suite/unified_exec.rs", + "codex-rs/core/tests/suite/view_image.rs" ], "source_state": "merged", - "subject_id": "27619", + "subject_id": "27972", "subject_kind": "pr", "surface_hints": [ "cli_tui", - "config_hooks", + "mcp_plugins", "tests_ci" ], - "title": "tui: clear stale hook row after turn completion", - "url": "https://github.com/openai/codex/pull/27619" + "title": "[codex] Let generic test turns inherit their environment", + "url": "https://github.com/openai/codex/pull/27972" }, { "attention_flags": [ + "auth_account", + "deprecated_removed", "new_feature", "protocol_change", "release_packaging", "security_policy" ], - "changed_file_count": 3, + "changed_file_count": 42, "commit_shas": [ - "0ebb68ad99d0eda8eb00f83d9d2653878875c814" + "5beb1d3bf50105bb17e1046b0a7381bc8f074704", + "4b5ca0f8b07f3ea4e1555bf53546e6153ac465e8", + "d4554c3a42b08747b29cb52390512ad8ef9ce015" ], - "committed_at": "2026-06-12T00:15:19Z", + "committed_at": "2026-06-12T23:58:42Z", "next_step": "ai_review_required", - "pr_number": 27711, - "pr_url": "https://github.com/openai/codex/pull/27711", - "review_priority": "high", - "review_reason": "Needs AI review for new_feature, protocol_change, release_packaging, security_policy.", + "pr_number": 27976, + "pr_url": "https://github.com/openai/codex/pull/27976", + "review_priority": "critical", + "review_reason": "Needs AI review for auth_account, deprecated_removed, new_feature, protocol_change, release_packaging, security_policy.", "sample_paths": [ "codex-rs/Cargo.lock", - "codex-rs/ext/image-generation/Cargo.toml", - "codex-rs/ext/image-generation/src/tool.rs" + "codex-rs/app-server/src/request_processors/fs_processor.rs", + "codex-rs/apply-patch/src/invocation.rs", + "codex-rs/apply-patch/src/lib.rs", + "codex-rs/config/src/loader/layer_io.rs", + "codex-rs/config/src/loader/mod.rs", + "codex-rs/config/src/loader/tests.rs", + "codex-rs/core-plugins/src/provider.rs", + "codex-rs/core-skills/src/injection.rs", + "codex-rs/core-skills/src/loader.rs", + "codex-rs/core-skills/src/model.rs", + "codex-rs/core/src/agents_md.rs" ], "source_state": "merged", - "subject_id": "27711", + "subject_id": "27976", "subject_kind": "pr", "surface_hints": [ - "config_hooks" + "app_server_protocol", + "auth_accounts", + "config_hooks", + "mcp_plugins", + "model_provider", + "sandbox_permissions", + "tests_ci" ], - "title": "Fix image extension PathUri conversion", - "url": "https://github.com/openai/codex/pull/27711" + "title": "[codex] make PathUri::from_abs_path infallible", + "url": "https://github.com/openai/codex/pull/27976" }, { - "attention_flags": [], - "changed_file_count": 1, + "attention_flags": [ + "auth_account", + "deprecated_removed", + "new_feature", + "protocol_change", + "security_policy" + ], + "changed_file_count": 11, "commit_shas": [ - "0ca5934aef35c66961dee37b1cf925dfaca9364f" + "a148a9c44082c55fff64b7d4ef0182dd3d088b3e", + "9ebebf0cb0af759667c1bdc5c4aff3df132f890a", + "5c33830e5678a7338b3f0782c481ada594d5be2f", + "122bcdf2ad64d386aefce7899f4da4ff77bf1ef8", + "6eea710f43558b241c3170bf488bb8a2df20cd54" ], - "committed_at": "2026-06-12T01:23:16Z", + "committed_at": "2026-06-13T00:11:32Z", "next_step": "ai_review_required", - "pr_number": 27719, - "pr_url": "https://github.com/openai/codex/pull/27719", - "review_priority": "high", - "review_reason": "Needs AI review for surface hints: app_server_protocol.", + "pr_number": 27710, + "pr_url": "https://github.com/openai/codex/pull/27710", + "review_priority": "critical", + "review_reason": "Needs AI review for auth_account, deprecated_removed, new_feature, protocol_change, security_policy.", "sample_paths": [ - "codex-rs/app-server/src/lib.rs" + "AGENTS.md", + "codex-rs/app-server/src/config_manager.rs", + "codex-rs/app-server/src/request_processors/thread_processor.rs", + "codex-rs/core-plugins/src/loader.rs", + "codex-rs/core-plugins/src/manager.rs", + "codex-rs/core-skills/src/manager.rs", + "codex-rs/core/src/connectors.rs", + "codex-rs/core/src/plugins/discoverable.rs", + "codex-rs/core/src/session/mod.rs", + "codex-rs/core/src/session/turn_context.rs", + "codex-rs/core/src/thread_manager.rs" ], "source_state": "merged", - "subject_id": "27719", + "subject_id": "27710", "subject_kind": "pr", "surface_hints": [ - "app_server_protocol" + "app_server_protocol", + "config_hooks", + "mcp_plugins" ], - "title": "fix: Recover from sqlite directory being a file", - "url": "https://github.com/openai/codex/pull/27719" + "title": "[codex] add latency tracing spans", + "url": "https://github.com/openai/codex/pull/27710" }, { "attention_flags": [ + "auth_account", + "breaking_change", + "deprecated_removed", + "new_feature", + "protocol_change", + "rate_limit", "release_packaging" ], - "changed_file_count": 1, + "changed_file_count": 42, "commit_shas": [ - "6cdfc74097433136f37f4969f16f22374e4f1fc0" + "40447b66b8534d4046401396da86fbe96af3a4f8" ], - "committed_at": "2026-06-12T02:44:36Z", + "committed_at": "2026-06-13T00:33:43Z", "next_step": "ai_review_required", - "pr_number": 27702, - "pr_url": "https://github.com/openai/codex/pull/27702", - "review_priority": "high", - "review_reason": "Needs AI review for release_packaging.", + "pr_number": 27925, + "pr_url": "https://github.com/openai/codex/pull/27925", + "review_priority": "critical", + "review_reason": "Needs AI review for auth_account, breaking_change, deprecated_removed, new_feature, protocol_change, rate_limit, release_packaging.", "sample_paths": [ - "codex-rs/Cargo.toml" + "codex-rs/tui/src/app.rs", + "codex-rs/tui/src/app/app_server_events.rs", + "codex-rs/tui/src/app/background_requests.rs", + "codex-rs/tui/src/app/event_dispatch.rs", + "codex-rs/tui/src/app/history_ui.rs", + "codex-rs/tui/src/app/resize_reflow.rs", + "codex-rs/tui/src/app/tests.rs", + "codex-rs/tui/src/app_backtrack.rs", + "codex-rs/tui/src/app_event.rs", + "codex-rs/tui/src/bottom_pane/chat_composer.rs", + "codex-rs/tui/src/bottom_pane/chat_composer/slash_input.rs", + "codex-rs/tui/src/bottom_pane/command_popup.rs" ], "source_state": "merged", - "subject_id": "27702", + "subject_id": "27925", "subject_kind": "pr", "surface_hints": [ - "config_hooks" + "app_server_protocol", + "auth_accounts", + "cli_tui", + "config_hooks", + "tests_ci" ], - "title": "[codex] parallelize release code generation", - "url": "https://github.com/openai/codex/pull/27702" + "title": "feat(tui): reland token activity command", + "url": "https://github.com/openai/codex/pull/27925" }, { "attention_flags": [ + "auth_account", + "deprecated_removed", "new_feature", "protocol_change", "security_policy" ], - "changed_file_count": 11, + "changed_file_count": 5, "commit_shas": [ - "f285bd830523f2b3c05c0214a2eeb1f93baa330f" + "5500d7a7c915d55e554d316ff2498a19a8977b55", + "13b29654fbdf2b982afff6ee1836c73aed3deba0" ], - "committed_at": "2026-06-12T03:35:28Z", + "committed_at": "2026-06-13T00:51:09Z", "next_step": "ai_review_required", - "pr_number": 27709, - "pr_url": "https://github.com/openai/codex/pull/27709", - "review_priority": "high", - "review_reason": "Needs AI review for new_feature, protocol_change, security_policy.", - "sample_paths": [ - "codex-rs/app-server/src/request_processors/request_errors.rs", - "codex-rs/app-server/src/request_processors/thread_processor.rs", - "codex-rs/app-server/src/request_processors/turn_processor.rs", - "codex-rs/core/src/context/environment_context.rs", - "codex-rs/core/src/environment_selection.rs", - "codex-rs/core/src/session/session.rs", - "codex-rs/core/src/session/tests.rs", - "codex-rs/core/src/session/turn_context.rs", - "codex-rs/core/src/shell.rs", - "codex-rs/core/src/thread_manager.rs", - "codex-rs/core/tests/suite/remote_env.rs" + "pr_number": 27988, + "pr_url": "https://github.com/openai/codex/pull/27988", + "review_priority": "critical", + "review_reason": "Needs AI review for auth_account, deprecated_removed, new_feature, protocol_change, security_policy.", + "sample_paths": [ + "codex-rs/Cargo.lock", + "codex-rs/core-plugins/Cargo.toml", + "codex-rs/core-plugins/src/discoverable.rs", + "codex-rs/core-plugins/src/discoverable_tests.rs", + "codex-rs/core/src/plugins/discoverable_tests.rs" ], "source_state": "merged", - "subject_id": "27709", + "subject_id": "27988", "subject_kind": "pr", "surface_hints": [ - "app_server_protocol", + "config_hooks", + "mcp_plugins", "tests_ci" ], - "title": "[codex] resolve environment shell metadata eagerly", - "url": "https://github.com/openai/codex/pull/27709" + "title": "[codex] Limit app-based plugin suggestions to remote catalogs", + "url": "https://github.com/openai/codex/pull/27988" }, { "attention_flags": [ + "auth_account", + "breaking_change", "new_feature", - "protocol_change" + "protocol_change", + "release_packaging" ], - "changed_file_count": 4, + "changed_file_count": 3, "commit_shas": [ - "e1f5097af20944fd4ab67a85119cda325df034e0", - "cf6dfc47a4ce06f2c2f0fb3b8b3482a444c33024", - "9fb656edd473b51a766ced9d3156e5e919be3b0b", - "0c221b1bdba602903635ca905a69d271517097ea", - "e318c8c73787d0afdf445d170c2ef204ad6e7dda", - "e1511bb644aad5eb4a6f84e0a3d1626d0909bb03" - ], - "committed_at": "2026-06-12T09:49:17Z", + "c3166f21172b5254033852ac1f75e03e4823863c", + "57bc034fab9dbc29f257be65c5dd84fe44eb4dfa" + ], + "committed_at": "2026-06-13T01:00:31Z", "next_step": "ai_review_required", - "pr_number": 27732, - "pr_url": "https://github.com/openai/codex/pull/27732", - "review_priority": "high", - "review_reason": "Needs AI review for new_feature, protocol_change.", + "pr_number": 27652, + "pr_url": "https://github.com/openai/codex/pull/27652", + "review_priority": "critical", + "review_reason": "Needs AI review for auth_account, breaking_change, new_feature, protocol_change, release_packaging.", "sample_paths": [ - "codex-rs/code-mode-protocol/src/description.rs", - "codex-rs/code-mode/src/runtime/value.rs", - "codex-rs/code-mode/src/service.rs", - "codex-rs/core/tests/suite/code_mode.rs" + "codex-rs/core-plugins/src/manager.rs", + "codex-rs/core-plugins/src/manager_tests.rs", + "codex-rs/core/src/thread_manager.rs" ], "source_state": "merged", - "subject_id": "27732", + "subject_id": "27652", "subject_kind": "pr", "surface_hints": [ - "app_server_protocol", + "mcp_plugins", "tests_ci" ], - "title": "[code-mode] Reject remote image URLs from output helpers", - "url": "https://github.com/openai/codex/pull/27732" + "title": "[codex] Add auth mode to plugin manager constructor", + "url": "https://github.com/openai/codex/pull/27652" }, { "attention_flags": [ @@ -1406,94 +1099,35 @@ { "attention_flags": [ "auth_account", - "new_feature", - "protocol_change" - ], - "changed_file_count": 5, - "commit_shas": [ - "585a3fd1e845ac42098ef2caa40cea13b17f0e3a" - ], - "committed_at": "2026-06-11T23:55:01Z", - "next_step": "ai_review_required", - "pr_number": 27623, - "pr_url": "https://github.com/openai/codex/pull/27623", - "review_priority": "normal", - "review_reason": "Needs AI review for auth_account, new_feature, protocol_change.", - "sample_paths": [ - "codex-rs/core/src/session/mod.rs", - "codex-rs/core/src/session/turn.rs", - "codex-rs/core/src/session_startup_prewarm.rs", - "codex-rs/core/src/tasks/mod.rs", - "codex-rs/core/src/tasks/regular.rs" - ], - "source_state": "merged", - "subject_id": "27623", - "subject_kind": "pr", - "surface_hints": [ - "internal_churn" - ], - "title": "Add spans to turn lifecycle gaps", - "url": "https://github.com/openai/codex/pull/27623" - }, - { - "attention_flags": [ - "release_packaging", - "security_policy" - ], - "changed_file_count": 3, - "commit_shas": [ - "30c334f609adb05a20c446c0f11e391aa27640f4", - "4cb95d86aa8be47c4b5d504b58799382f13e0a11", - "cd7264b628cfe8512e03035210c5a7f058112bb9", - "58064857225b9649756529974249db82c12ca808" - ], - "committed_at": "2026-06-12T01:44:42Z", - "next_step": "ai_review_required", - "pr_number": 27715, - "pr_url": "https://github.com/openai/codex/pull/27715", - "review_priority": "normal", - "review_reason": "Needs AI review for release_packaging, security_policy.", - "sample_paths": [ - ".github/scripts/test_v8_canary_changes.py", - ".github/scripts/v8_canary_changes.py", - ".github/workflows/v8-canary.yml" - ], - "source_state": "merged", - "subject_id": "27715", - "subject_kind": "pr", - "surface_hints": [ - "tests_ci" - ], - "title": "ci(v8): gate Windows source builds on relevant changes", - "url": "https://github.com/openai/codex/pull/27715" - }, - { - "attention_flags": [ "new_feature", "protocol_change", "security_policy" ], - "changed_file_count": 1, + "changed_file_count": 4, "commit_shas": [ - "09d45b408a88670c30b2fd03a3c81d6d6456b436" + "d8961dbcec304ece82efc081a64c5a165a376bb7" ], - "committed_at": "2026-06-12T06:20:36Z", + "committed_at": "2026-06-12T20:23:22Z", "next_step": "ai_review_required", - "pr_number": 27778, - "pr_url": "https://github.com/openai/codex/pull/27778", - "review_priority": "normal", - "review_reason": "Needs AI review for new_feature, protocol_change, security_policy.", + "pr_number": 27926, + "pr_url": "https://github.com/openai/codex/pull/27926", + "review_priority": "high", + "review_reason": "Needs AI review for auth_account, new_feature, protocol_change, security_policy.", "sample_paths": [ - ".github/workflows/issue-translator.yml" + "codex-rs/Cargo.lock", + "codex-rs/core-skills/Cargo.toml", + "codex-rs/core-skills/src/invocation_utils.rs", + "codex-rs/core-skills/src/invocation_utils_tests.rs" ], "source_state": "merged", - "subject_id": "27778", + "subject_id": "27926", "subject_kind": "pr", "surface_hints": [ + "config_hooks", "tests_ci" ], - "title": "Translate non-English issues", - "url": "https://github.com/openai/codex/pull/27778" + "title": "[codex] Align implicit skill reads with parser", + "url": "https://github.com/openai/codex/pull/27926" }, { "attention_flags": [ @@ -1617,29 +1251,329 @@ "url": "https://github.com/openai/codex/pull/27939" }, { - "attention_flags": [], + "attention_flags": [ + "new_feature" + ], "changed_file_count": 2, "commit_shas": [ - "59ff44bc76660a6b9e8e3ab135cda64d2abc93f3" + "7dfb944924fed2e4c5665fdb5f1e68cc61a1d306", + "bf304810261929bb4256b3a72018fed46170281c", + "b4e5207e35b3c72b4a5fc3fb5638971d0835e619", + "add216625ec76a84dbde99cff133cf547d261d02", + "4ca37ea9d4fcee4e484090904c8f119fe4bf38e4", + "3aa942edbcf0488187c4b0dbfbd9a55bdd30b4af" + ], + "committed_at": "2026-06-12T21:52:07Z", + "next_step": "ai_review_required", + "pr_number": 27076, + "pr_url": "https://github.com/openai/codex/pull/27076", + "review_priority": "normal", + "review_reason": "Needs AI review for new_feature.", + "sample_paths": [ + "codex-rs/features/src/lib.rs", + "codex-rs/features/src/tests.rs" + ], + "source_state": "merged", + "subject_id": "27076", + "subject_kind": "pr", + "surface_hints": [ + "tests_ci" + ], + "title": "Warn for structured feature toggles", + "url": "https://github.com/openai/codex/pull/27076" + }, + { + "attention_flags": [ + "auth_account", + "deprecated_removed", + "new_feature", + "protocol_change", + "security_policy" + ], + "changed_file_count": 17, + "commit_shas": [ + "ecb83dc0aedffece5c65b341fe0b073eef92fc3e" + ], + "committed_at": "2026-06-12T22:34:04Z", + "next_step": "ai_review_required", + "pr_number": 27509, + "pr_url": "https://github.com/openai/codex/pull/27509", + "review_priority": "normal", + "review_reason": "Needs AI review for auth_account, deprecated_removed, new_feature, protocol_change, security_policy.", + "sample_paths": [ + "codex-rs/tui/src/app/event_dispatch.rs", + "codex-rs/tui/src/app/tests.rs", + "codex-rs/tui/src/app/thread_goal_actions.rs", + "codex-rs/tui/src/app_event.rs", + "codex-rs/tui/src/bottom_pane/chat_composer.rs", + "codex-rs/tui/src/bottom_pane/mod.rs", + "codex-rs/tui/src/chatwidget/goal_menu.rs", + "codex-rs/tui/src/chatwidget/input_flow.rs", + "codex-rs/tui/src/chatwidget/input_restore.rs", + "codex-rs/tui/src/chatwidget/interaction.rs", + "codex-rs/tui/src/chatwidget/slash_dispatch.rs", + "codex-rs/tui/src/chatwidget/tests.rs" + ], + "source_state": "merged", + "subject_id": "27509", + "subject_kind": "pr", + "surface_hints": [ + "cli_tui", + "tests_ci" + ], + "title": "[2 of 3] Support long pasted text in TUI goals", + "url": "https://github.com/openai/codex/pull/27509" + }, + { + "attention_flags": [ + "auth_account", + "new_feature", + "protocol_change", + "security_policy" + ], + "changed_file_count": 6, + "commit_shas": [ + "834d47cb7dd42d0386620c209f75359fd01fe65b", + "573e1cd0f65d65e64487711124b89d22f1a319b4", + "1862ba37a36cc0ebcf1b512cf2ecfc74427a1e7d", + "671c94b06c9ec655ac6a08a86ad45f345222cfef", + "c4e497b38e49fb9eef7be735f1f14776e4635958", + "59031001029797ca92be4aadc02057b2a9543d5a" + ], + "committed_at": "2026-06-12T22:50:30Z", + "next_step": "ai_review_required", + "pr_number": 27109, + "pr_url": "https://github.com/openai/codex/pull/27109", + "review_priority": "normal", + "review_reason": "Needs AI review for auth_account, new_feature, protocol_change, security_policy.", + "sample_paths": [ + "codex-rs/analytics/src/analytics_client_tests.rs", + "codex-rs/analytics/src/events.rs", + "codex-rs/analytics/src/lib.rs", + "codex-rs/core/src/guardian/review.rs", + "codex-rs/core/src/guardian/review_session.rs", + "codex-rs/core/src/guardian/tests.rs" + ], + "source_state": "merged", + "subject_id": "27109", + "subject_kind": "pr", + "surface_hints": [ + "cli_tui", + "tests_ci" + ], + "title": "Add Guardian catalog diagnostics metadata", + "url": "https://github.com/openai/codex/pull/27109" + }, + { + "attention_flags": [ + "new_feature", + "release_packaging" + ], + "changed_file_count": 1, + "commit_shas": [ + "900e4e269085dbe611456d22f9cfd8430913b01b" + ], + "committed_at": "2026-06-12T23:25:58Z", + "next_step": "ai_review_required", + "pr_number": 27966, + "pr_url": "https://github.com/openai/codex/pull/27966", + "review_priority": "normal", + "review_reason": "Needs AI review for new_feature, release_packaging.", + "sample_paths": [ + "AGENTS.md" + ], + "source_state": "merged", + "subject_id": "27966", + "subject_kind": "pr", + "surface_hints": [ + "internal_churn" + ], + "title": "Specify platform support in AGENTS.md", + "url": "https://github.com/openai/codex/pull/27966" + }, + { + "attention_flags": [ + "deprecated_removed", + "release_packaging" + ], + "changed_file_count": 1, + "commit_shas": [ + "b6120fe5778a0a3a2e595941f2d2520d87e25962" + ], + "committed_at": "2026-06-12T23:26:39Z", + "next_step": "ai_review_required", + "pr_number": 27855, + "pr_url": "https://github.com/openai/codex/pull/27855", + "review_priority": "normal", + "review_reason": "Needs AI review for deprecated_removed, release_packaging.", + "sample_paths": [ + ".github/workflows/rust-release-windows.yml" + ], + "source_state": "merged", + "subject_id": "27855", + "subject_kind": "pr", + "surface_hints": [ + "release_packaging", + "tests_ci" + ], + "title": "[codex] parallelize Windows compression", + "url": "https://github.com/openai/codex/pull/27855" + }, + { + "attention_flags": [ + "protocol_change", + "release_packaging", + "security_policy" + ], + "changed_file_count": 1, + "commit_shas": [ + "4a47b5a20ffe31b27af2870ef0e43ac797d82952" + ], + "committed_at": "2026-06-12T23:52:23Z", + "next_step": "ai_review_required", + "pr_number": 27856, + "pr_url": "https://github.com/openai/codex/pull/27856", + "review_priority": "normal", + "review_reason": "Needs AI review for protocol_change, release_packaging, security_policy.", + "sample_paths": [ + ".github/workflows/rust-release-windows.yml" + ], + "source_state": "merged", + "subject_id": "27856", + "subject_kind": "pr", + "surface_hints": [ + "release_packaging", + "tests_ci" + ], + "title": "[codex] package Windows symbols in parallel", + "url": "https://github.com/openai/codex/pull/27856" + }, + { + "attention_flags": [ + "deprecated_removed", + "release_packaging" + ], + "changed_file_count": 1, + "commit_shas": [ + "cd08ab789367666570e9e93489899319a0ce75ef" + ], + "committed_at": "2026-06-13T00:00:15Z", + "next_step": "ai_review_required", + "pr_number": 27854, + "pr_url": "https://github.com/openai/codex/pull/27854", + "review_priority": "normal", + "review_reason": "Needs AI review for deprecated_removed, release_packaging.", + "sample_paths": [ + ".github/workflows/rust-release-windows.yml" + ], + "source_state": "merged", + "subject_id": "27854", + "subject_kind": "pr", + "surface_hints": [ + "release_packaging", + "tests_ci" + ], + "title": "[codex] parallelize Windows package archives", + "url": "https://github.com/openai/codex/pull/27854" + }, + { + "attention_flags": [ + "deprecated_removed", + "release_packaging" + ], + "changed_file_count": 1, + "commit_shas": [ + "587746d90fd392e8b167de8e51006803266b633a" + ], + "committed_at": "2026-06-13T00:01:14Z", + "next_step": "ai_review_required", + "pr_number": 27853, + "pr_url": "https://github.com/openai/codex/pull/27853", + "review_priority": "normal", + "review_reason": "Needs AI review for deprecated_removed, release_packaging.", + "sample_paths": [ + "scripts/stage_npm_packages.py" + ], + "source_state": "merged", + "subject_id": "27853", + "subject_kind": "pr", + "surface_hints": [ + "release_packaging" + ], + "title": "[codex] stage npm packages concurrently", + "url": "https://github.com/openai/codex/pull/27853" + }, + { + "attention_flags": [ + "deprecated_removed", + "new_feature", + "protocol_change" + ], + "changed_file_count": 5, + "commit_shas": [ + "b3f37c48499df0d2b374618991f6ad75f8208d63" + ], + "committed_at": "2026-06-13T00:14:27Z", + "next_step": "ai_review_required", + "pr_number": 27510, + "pr_url": "https://github.com/openai/codex/pull/27510", + "review_priority": "normal", + "review_reason": "Needs AI review for deprecated_removed, new_feature, protocol_change.", + "sample_paths": [ + "codex-rs/tui/src/app/tests.rs", + "codex-rs/tui/src/bottom_pane/mod.rs", + "codex-rs/tui/src/chatwidget/slash_dispatch.rs", + "codex-rs/tui/src/chatwidget/tests/slash_commands.rs", + "codex-rs/tui/src/goal_files.rs" + ], + "source_state": "merged", + "subject_id": "27510", + "subject_kind": "pr", + "surface_hints": [ + "cli_tui", + "tests_ci" + ], + "title": "[3 of 3] Support images in TUI goals", + "url": "https://github.com/openai/codex/pull/27510" + }, + { + "attention_flags": [ + "new_feature", + "release_packaging" + ], + "changed_file_count": 12, + "commit_shas": [ + "25d5679c7824871e2a5359e2c9d7e023a0c06ed9", + "da01e88dd828082ec82058354cd3df0d3185d74f" ], - "committed_at": "2026-06-12T15:58:08Z", + "committed_at": "2026-06-13T01:24:49Z", "next_step": "ai_review_required", - "pr_number": 27791, - "pr_url": "https://github.com/openai/codex/pull/27791", - "review_priority": "low", - "review_reason": "Needs AI review for surface hints: cli_tui.", + "pr_number": 27964, + "pr_url": "https://github.com/openai/codex/pull/27964", + "review_priority": "normal", + "review_reason": "Needs AI review for new_feature, release_packaging.", "sample_paths": [ - "codex-rs/tui/src/app/input.rs", - "codex-rs/tui/src/app_backtrack.rs" + "MODULE.bazel", + "bazel/modules/BUILD.bazel", + "bazel/modules/wine.MODULE.bazel", + "bazel/rules/testing/BUILD.bazel", + "bazel/rules/testing/foreign_platform_binary.bzl", + "bazel/rules/testing/wine.bzl", + "bazel/rules/testing/wine/BUILD.bazel", + "bazel/rules/testing/wine/fixtures/windows_smoke.rs", + "bazel/rules/testing/wine/src/lib.rs", + "bazel/rules/testing/wine/src/lib_tests.rs", + "defs.bzl", + "third_party/wine/BUILD.bazel" ], "source_state": "merged", - "subject_id": "27791", + "subject_id": "27964", "subject_kind": "pr", "surface_hints": [ - "cli_tui" + "tests_ci" ], - "title": "Reject transcript backtrack in side conversations", - "url": "https://github.com/openai/codex/pull/27791" + "title": "[codex] Add hermetic Wine test support", + "url": "https://github.com/openai/codex/pull/27964" } ] } diff --git a/artifacts/github/reviews/openai-codex-pr-27720.review.json b/artifacts/github/reviews/openai-codex-pr-27720.review.json new file mode 100644 index 000000000..d56fb085d --- /dev/null +++ b/artifacts/github/reviews/openai-codex-pr-27720.review.json @@ -0,0 +1,76 @@ +{ + "adoption_opportunity": "If Decodex starts or proxies realtime sessions through app-server v2, preserve the optional architecture override and keep config validation aligned with Codex's `realtimeapi` and `avas` enum.", + "caveats": "The PR describes AVAS as an opt-in realtime v1 WebRTC architecture. The default remains `realtimeapi`, and the added WebRTC call base URL is marked experimental.", + "changed_surfaces": [ + "app-server v2 `thread/realtime/start` params", + "app-server protocol JSON and TypeScript schema fixtures", + "core realtime conversation start parameters", + "realtime WebRTC call creation", + "Codex config schema and `[realtime].architecture` loading", + "realtime app-server and core tests" + ], + "community_value": "Medium for operators tracking realtime protocol drift, because it names the opt-in AVAS architecture and where app-server clients can pass it.", + "compatibility_risk": "Medium. The app-server realtime start params gain a nullable architecture enum and clients with generated protocol types may need to regenerate or tolerate the new optional field.", + "confidence": "confirmed", + "control_plane_relevance": "High. Decodex Control Plane compatibility depends on tracking app-server protocol additions, especially optional realtime-session parameters that change downstream request construction.", + "deprecated_or_breaking_notes": "No realtime architecture was removed. The source-backed change adds `RealtimeConversationArchitecture` with `realtimeapi` as default and `avas` as opt-in.", + "evidence": [ + "PR #27720 says it adds `RealtimeConversationArchitecture`, defaults to `realtimeapi`, and exposes `avas` as an opt-in architecture.", + "`codex-rs/app-server-protocol/src/protocol/v2/realtime.rs` adds nullable `architecture` to `ThreadRealtimeStartParams`.", + "`codex-rs/protocol/src/protocol.rs` adds the `RealtimeConversationArchitecture` enum with `realtimeapi` and `avas` values.", + "`codex-rs/core/src/realtime_conversation.rs` carries the architecture into realtime conversation startup.", + "`codex-rs/codex-api/src/endpoint/realtime_call.rs` adds architecture-aware WebRTC call creation.", + "`codex-rs/core/config.schema.json` adds `[realtime].architecture` schema support.", + "The normalized bundle `artifacts/github/bundles/openai-codex-pr-27720.json` records 22 changed files for the merged PR." + ], + "next_actions": [ + { + "reason": "The app-server realtime protocol addition can affect Decodex Control Plane clients and compatibility tests.", + "type": "upstream_impact" + }, + { + "reason": "The change has a clear operator-facing public angle around realtime architecture selection and protocol drift.", + "type": "social_candidate" + } + ], + "observed_change": "Codex adds an opt-in AVAS realtime architecture for WebRTC starts and exposes the choice through app-server realtime-start params and config.", + "repo": "openai/codex", + "reviewed_at": "2026-06-13T02:08:29Z", + "schema": "upstream_review/v1", + "slug": "openai-codex-pr-27720", + "source_refs": { + "items": [ + { + "kind": "pull_request", + "meta": "Merged 2026-06-12T18:11:13Z", + "title": "realtime: add AVAS architecture override", + "url": "https://github.com/openai/codex/pull/27720" + }, + { + "kind": "commit", + "title": "realtime: add AVAS architecture override", + "url": "https://github.com/openai/codex/commit/37efa545e8004b930a496c91c10ccc860937c29d" + }, + { + "kind": "commit", + "title": "realtime: update app-server schema fixtures", + "url": "https://github.com/openai/codex/commit/3a9e2d6f25149e2b2e3fe707ce682b211c007349" + } + ] + }, + "subject": { + "commit_shas": [ + "37efa545e8004b930a496c91c10ccc860937c29d", + "efd9be5adb25da27764e9e5a2221d14356ce7838", + "44dee73a25a44376823a6c3015779f6c476d47af", + "ebad839a70f8719b40fa78586fc4fa5f5e130e4b", + "3a9e2d6f25149e2b2e3fe707ce682b211c007349", + "c8f27780ed88df644693301f7fb79c661a6995d4", + "66a18813f2cded55678c34de157ca9143f8a432b", + "fa3b65a7e43afac7a10f8c052539b133f2d6dd1f" + ], + "subject_id": "27720", + "subject_kind": "pr" + }, + "user_visible_path": "App-server clients starting realtime sessions can pass an optional `architecture` value, and users configuring realtime can opt into AVAS through `[realtime].architecture`." +} diff --git a/artifacts/github/reviews/openai-codex-pr-27816.review.json b/artifacts/github/reviews/openai-codex-pr-27816.review.json new file mode 100644 index 000000000..71ab39ad0 --- /dev/null +++ b/artifacts/github/reviews/openai-codex-pr-27816.review.json @@ -0,0 +1,65 @@ +{ + "adoption_opportunity": "Audit Decodex sandbox and remote-environment assumptions for cwd handling, especially any app-server, exec-server, or tool bridge code that assumes cwd values are native host paths before the receiving filesystem validates them.", + "caveats": "The PR is a migration of internal and protocol plumbing. It improves host-boundary semantics but does not introduce a new end-user command.", + "changed_surfaces": [ + "filesystem sandbox context cwd representation", + "sandbox command transform inputs", + "core turn-environment cwd accessors", + "remote exec-server filesystem transport", + "tool runtime sandbox construction", + "PathUri migration tests across core, exec-server, and sandboxing" + ], + "community_value": "Medium for operators using remote filesystems or sandboxed execution, because it explains why cwd values now retain URI semantics across host boundaries.", + "compatibility_risk": "High for Decodex Control Plane integrations that inspect or construct sandbox context cwd values, because upstream now carries `PathUri` until the execution host validates and converts it.", + "confidence": "confirmed", + "control_plane_relevance": "High. Decodex routes tool execution, sandbox policy, and remote filesystem behavior through app-server and exec-server boundaries where cwd interpretation affects safety and correctness.", + "deprecated_or_breaking_notes": "Native cwd interpretation is moved later in the pipeline. Non-native cwd URIs are rejected without fallback at the receiving host instead of being interpreted early as local paths.", + "evidence": [ + "PR #27816 says sandbox cwd values should retain URI semantics across app-server and exec-server host boundaries until the receiving host validates them.", + "`codex-rs/file-system/src/lib.rs` changes `FileSystemSandboxContext.cwd` from an absolute path to `PathUri`.", + "`codex-rs/sandboxing/src/manager.rs` changes `SandboxCommand.cwd` to `PathUri` and adds native launch request conversion at the execution boundary.", + "`codex-rs/core/src/session/turn_context.rs` keeps paired native and URI cwd values behind immutable accessors during migration.", + "`codex-rs/exec-server/src/remote_file_system_path_uri_tests.rs` extends remote filesystem PathUri coverage.", + "The normalized bundle `artifacts/github/bundles/openai-codex-pr-27816.json` records 40 changed files for the merged PR." + ], + "next_actions": [ + { + "reason": "The cwd representation change can affect Decodex sandbox, tool, and remote-filesystem compatibility.", + "type": "upstream_impact" + }, + { + "reason": "The change is useful as a cautious operator-impact note for remote/sandbox boundary watchers.", + "type": "social_candidate" + } + ], + "observed_change": "Codex migrates sandbox cwd handling to `PathUri` across core, sandboxing, filesystem, and exec-server boundaries.", + "repo": "openai/codex", + "reviewed_at": "2026-06-13T02:08:29Z", + "schema": "upstream_review/v1", + "slug": "openai-codex-pr-27816", + "source_refs": { + "items": [ + { + "kind": "pull_request", + "meta": "Merged 2026-06-12T18:38:02Z", + "title": "sandboxing: migrate cwd inputs to PathUri", + "url": "https://github.com/openai/codex/pull/27816" + }, + { + "kind": "commit", + "title": "sandboxing: migrate cwd inputs to PathUri", + "url": "https://github.com/openai/codex/commit/69a5b897facddfdb48dc4cccb173541f5349aa6f" + } + ] + }, + "subject": { + "commit_shas": [ + "69a5b897facddfdb48dc4cccb173541f5349aa6f", + "db68524fe5280a98ae8a500448d2c7eb46b33164", + "a57dab38147d453e05cd391eed4a3ab83a251f71" + ], + "subject_id": "27816", + "subject_kind": "pr" + }, + "user_visible_path": "Users may not see a new command, but remote and sandboxed executions should preserve cwd URI semantics more accurately across host boundaries." +} diff --git a/artifacts/github/reviews/openai-codex-pr-27890.review.json b/artifacts/github/reviews/openai-codex-pr-27890.review.json new file mode 100644 index 000000000..63074f7fd --- /dev/null +++ b/artifacts/github/reviews/openai-codex-pr-27890.review.json @@ -0,0 +1,64 @@ +{ + "adoption_opportunity": "Surface `PluginDetail.shareUrl` in Decodex plugin UI or Publisher explanations when remote plugin copy-link behavior matters, while preserving existing `shareContext` semantics for local and workspace sharing.", + "caveats": "The new field is nullable and additive. Existing `PluginSummary.shareContext` behavior is intentionally preserved.", + "changed_surfaces": [ + "app-server protocol `PluginDetail`", + "app-server protocol JSON and TypeScript schema fixtures", + "remote plugin detail conversion", + "plugin/read request processor", + "app-server plugin README", + "plugin read and TUI plugin detail tests" + ], + "community_value": "High for Codex clients and plugin UI authors because it gives remote plugins a direct copy-link field without overloading workspace share context.", + "compatibility_risk": "Medium-low. The app-server protocol adds a nullable `shareUrl` field to `PluginDetail`; generated clients should regenerate but existing response semantics are preserved.", + "confidence": "confirmed", + "control_plane_relevance": "High. Decodex Control Plane and Publisher plugin surfaces depend on app-server plugin/read schema details and remote plugin metadata.", + "deprecated_or_breaking_notes": "No share behavior was removed. The PR body says `shareContext` behavior remains unchanged for local and workspace sharing flows.", + "evidence": [ + "PR #27890 says remote plugin detail already includes canonical `share_url`, but `plugin/read` did not expose it for global plugins.", + "`codex-rs/app-server-protocol/src/protocol/v2/plugin.rs` adds nullable `share_url` to `PluginDetail`.", + "`codex-rs/app-server/src/request_processors/plugins.rs` sets local plugin `share_url` to null and maps remote plugin detail `share_url` through.", + "`codex-rs/core-plugins/src/remote.rs` carries `share_url` into `RemotePluginDetail`.", + "`codex-rs/app-server/tests/suite/v2/plugin_read.rs` adds coverage for admin-disabled remote plugin share URL behavior.", + "The normalized bundle `artifacts/github/bundles/openai-codex-pr-27890.json` records 11 changed files for the merged PR." + ], + "next_actions": [ + { + "reason": "The app-server plugin/read schema addition affects Decodex plugin metadata consumers.", + "type": "upstream_impact" + }, + { + "reason": "The change has a concrete practical public explanation for remote plugin copy-link UI behavior.", + "type": "social_candidate" + } + ], + "observed_change": "Codex exposes remote plugin canonical share URLs as nullable `PluginDetail.shareUrl` while preserving existing share-context behavior.", + "repo": "openai/codex", + "reviewed_at": "2026-06-13T02:08:29Z", + "schema": "upstream_review/v1", + "slug": "openai-codex-pr-27890", + "source_refs": { + "items": [ + { + "kind": "pull_request", + "meta": "Merged 2026-06-12T18:53:56Z", + "title": "[codex] expose remote plugin share URL", + "url": "https://github.com/openai/codex/pull/27890" + }, + { + "kind": "commit", + "title": "[plugins] expose remote plugin share URL", + "url": "https://github.com/openai/codex/commit/79e6ea4a8182b747e0329082a2b70215a70253b3" + } + ] + }, + "subject": { + "commit_shas": [ + "79e6ea4a8182b747e0329082a2b70215a70253b3", + "f63cf1908952d8daed71bcdb63efda76bfa15ef2" + ], + "subject_id": "27890", + "subject_kind": "pr" + }, + "user_visible_path": "Plugin clients can read `PluginDetail.shareUrl` for remote plugin copy-link actions, including admin-disabled global plugins, without changing existing share modal semantics." +} diff --git a/artifacts/github/reviews/openai-codex-pr-27927.review.json b/artifacts/github/reviews/openai-codex-pr-27927.review.json new file mode 100644 index 000000000..7a4c6de58 --- /dev/null +++ b/artifacts/github/reviews/openai-codex-pr-27927.review.json @@ -0,0 +1,59 @@ +{ + "adoption_opportunity": "Use the upstream metadata size signal when Decodex needs to reject oversized remote or sandboxed files before transferring or buffering their contents.", + "caveats": "The PR body explicitly says the new size field is internal and not exposed through the app-server API.", + "changed_surfaces": [ + "internal `FileMetadata` shape", + "local filesystem metadata population", + "exec-server metadata response", + "remote and sandboxed filesystem metadata mapping", + "filesystem metadata tests across local, remote, sandboxed, directory, and symlink cases" + ], + "community_value": "Low-medium. The change matters to operators and implementers concerned with remote file transfer cost, but it is intentionally not a public app-server API feature.", + "compatibility_risk": "Medium for internal consumers that construct or deserialize `FileMetadata`; low for app-server clients because the field is not exposed through app-server API.", + "confidence": "confirmed", + "control_plane_relevance": "Medium. Decodex Control Plane may benefit from size-aware metadata before remote file reads, but this is currently an internal exec-server/filesystem capability rather than a direct app-server protocol change.", + "deprecated_or_breaking_notes": "No public API field was removed. Internal `FileMetadata` and exec-server metadata responses now include a required `size` field.", + "evidence": [ + "PR #27927 says `ExecutorFileSystem::get_metadata` now reports size so consumers can reject oversized files before transfer or buffering.", + "`codex-rs/file-system/src/lib.rs` adds `size: u64` to `FileMetadata`.", + "`codex-rs/exec-server/src/protocol.rs` adds `size` to `FsGetMetadataResponse`.", + "`codex-rs/exec-server/src/local_file_system.rs` populates `size` from filesystem metadata length.", + "`codex-rs/exec-server/src/remote_file_system.rs` and `sandboxed_file_system.rs` carry the size value through.", + "The normalized bundle `artifacts/github/bundles/openai-codex-pr-27927.json` records 11 changed files for the merged PR." + ], + "next_actions": [ + { + "reason": "The internal metadata addition may be useful for Decodex remote-file safety and efficiency follow-up, but it is not a strong public Publisher candidate by itself.", + "type": "upstream_impact" + } + ], + "observed_change": "Codex adds an internal `size` field to filesystem metadata and carries it through local, remote, and sandboxed exec-server metadata paths.", + "repo": "openai/codex", + "reviewed_at": "2026-06-13T02:08:29Z", + "schema": "upstream_review/v1", + "slug": "openai-codex-pr-27927", + "source_refs": { + "items": [ + { + "kind": "pull_request", + "meta": "Merged 2026-06-12T19:12:08Z", + "title": "[codex] Add size to internal filesystem metadata", + "url": "https://github.com/openai/codex/pull/27927" + }, + { + "kind": "commit", + "title": "Add size to filesystem metadata", + "url": "https://github.com/openai/codex/commit/138e4eeeeaaeed2d04a74283e13e30124a75bcd1" + } + ] + }, + "subject": { + "commit_shas": [ + "138e4eeeeaaeed2d04a74283e13e30124a75bcd1", + "d4e267882417929bfa34d49398f7043f95cddc3c" + ], + "subject_id": "27927", + "subject_kind": "pr" + }, + "user_visible_path": "No direct user-visible app-server path; the likely effect is earlier internal rejection of oversized files before remote or sandboxed reads transfer content." +} diff --git a/artifacts/github/social-candidates/openai-codex-pr-27720.json b/artifacts/github/social-candidates/openai-codex-pr-27720.json new file mode 100644 index 000000000..9c3f397d8 --- /dev/null +++ b/artifacts/github/social-candidates/openai-codex-pr-27720.json @@ -0,0 +1,53 @@ +{ + "audience": "Control Plane operators tracking Codex realtime protocol changes", + "candidate_text": [ + "Codex added an opt-in `avas` realtime architecture for WebRTC starts, exposed through app-server `thread/realtime/start` and `[realtime].architecture`. Useful protocol drift for Control Plane operators. PR: https://github.com/openai/codex/pull/27720" + ], + "caveats": [ + "Do not imply AVAS is the default.", + "Keep the claim scoped to realtime v1 WebRTC starts and app-server/config exposure." + ], + "channel": "x", + "claims": [ + { + "confidence": "confirmed", + "evidence": "artifacts/github/reviews/openai-codex-pr-27720.review.json", + "text": "Codex exposes an optional realtime architecture parameter with `avas` and `realtimeapi` values." + }, + { + "confidence": "confirmed", + "evidence": "artifacts/github/impact/openai-codex-pr-27720.json", + "text": "The change is relevant to Control Plane app-server protocol compatibility." + } + ], + "decision": { + "idempotency_key": "x:decodexspace:openai-codex-pr-27720:operator_impact", + "reason": "The change has a concrete Control Plane protocol angle and source links.", + "worthiness": "publish" + }, + "evidence_notes": [ + "App-server realtime start params add nullable architecture.", + "The enum values are `realtimeapi` and `avas`.", + "Config schema adds `[realtime].architecture`." + ], + "mode": "operator_impact", + "next_steps": [ + "Let Publisher automation decide whether to reserve or publish this candidate." + ], + "priority": "critical", + "repo": "openai/codex", + "schema": "social_candidate/v1", + "slug": "openai-codex-pr-27720", + "source_refs": { + "upstream_impacts": [ + "artifacts/github/impact/openai-codex-pr-27720.json" + ], + "upstream_reviews": [ + "artifacts/github/reviews/openai-codex-pr-27720.review.json" + ], + "urls": [ + "https://github.com/openai/codex/pull/27720" + ] + }, + "target_account": "decodexspace" +} diff --git a/artifacts/github/social-candidates/openai-codex-pr-27816.json b/artifacts/github/social-candidates/openai-codex-pr-27816.json new file mode 100644 index 000000000..22f1999b8 --- /dev/null +++ b/artifacts/github/social-candidates/openai-codex-pr-27816.json @@ -0,0 +1,53 @@ +{ + "audience": "Control Plane operators using remote or sandboxed Codex execution", + "candidate_text": [ + "Codex migrated sandbox cwd handling to `PathUri` across app-server/exec-server boundaries, so remote hosts validate cwd semantics instead of interpreting native paths early. Control Plane compatibility material. PR: https://github.com/openai/codex/pull/27816" + ], + "caveats": [ + "This is an operator-impact note, not a new end-user command.", + "Do not claim Decodex has already adopted any local change." + ], + "channel": "x", + "claims": [ + { + "confidence": "confirmed", + "evidence": "artifacts/github/reviews/openai-codex-pr-27816.review.json", + "text": "Sandbox cwd values now retain PathUri semantics across host boundaries." + }, + { + "confidence": "confirmed", + "evidence": "artifacts/github/impact/openai-codex-pr-27816.json", + "text": "The migration is a Control Plane compatibility risk for sandbox and remote-filesystem assumptions." + } + ], + "decision": { + "idempotency_key": "x:decodexspace:openai-codex-pr-27816:operator_impact", + "reason": "The source-backed change has a clear operator-impact angle for remote and sandboxed execution boundaries.", + "worthiness": "publish" + }, + "evidence_notes": [ + "FileSystemSandboxContext.cwd changed to PathUri.", + "SandboxManager validates and converts cwd at the execution boundary.", + "Remote filesystem PathUri tests were extended." + ], + "mode": "operator_impact", + "next_steps": [ + "Let Publisher automation decide whether to reserve or publish this candidate." + ], + "priority": "critical", + "repo": "openai/codex", + "schema": "social_candidate/v1", + "slug": "openai-codex-pr-27816", + "source_refs": { + "upstream_impacts": [ + "artifacts/github/impact/openai-codex-pr-27816.json" + ], + "upstream_reviews": [ + "artifacts/github/reviews/openai-codex-pr-27816.review.json" + ], + "urls": [ + "https://github.com/openai/codex/pull/27816" + ] + }, + "target_account": "decodexspace" +} diff --git a/artifacts/github/social-candidates/openai-codex-pr-27890.json b/artifacts/github/social-candidates/openai-codex-pr-27890.json new file mode 100644 index 000000000..a4dfca372 --- /dev/null +++ b/artifacts/github/social-candidates/openai-codex-pr-27890.json @@ -0,0 +1,53 @@ +{ + "audience": "Codex plugin UI builders and Control Plane operators", + "candidate_text": [ + "Codex `plugin/read` now exposes `PluginDetail.shareUrl` for remote plugins, including admin-disabled global plugins, while keeping existing `shareContext` semantics. Practical for copy-link plugin UIs. PR: https://github.com/openai/codex/pull/27890" + ], + "caveats": [ + "Do not imply disabled remote plugins become installable.", + "Keep shareUrl separate from shareContext in public wording." + ], + "channel": "x", + "claims": [ + { + "confidence": "confirmed", + "evidence": "artifacts/github/reviews/openai-codex-pr-27890.review.json", + "text": "PluginDetail now carries nullable shareUrl for remote plugins." + }, + { + "confidence": "confirmed", + "evidence": "artifacts/github/impact/openai-codex-pr-27890.json", + "text": "The existing shareContext semantics remain separate from the remote canonical share URL." + } + ], + "decision": { + "idempotency_key": "x:decodexspace:openai-codex-pr-27890:practical_explainer", + "reason": "The change has a concrete user-facing copy-link explanation for remote plugin UI consumers.", + "worthiness": "publish" + }, + "evidence_notes": [ + "PluginDetail adds nullable shareUrl.", + "Remote plugin detail maps upstream share_url through.", + "Plugin read tests cover admin-disabled remote plugin share URLs." + ], + "mode": "practical_explainer", + "next_steps": [ + "Let Publisher automation decide whether to reserve or publish this candidate." + ], + "priority": "critical", + "repo": "openai/codex", + "schema": "social_candidate/v1", + "slug": "openai-codex-pr-27890", + "source_refs": { + "upstream_impacts": [ + "artifacts/github/impact/openai-codex-pr-27890.json" + ], + "upstream_reviews": [ + "artifacts/github/reviews/openai-codex-pr-27890.review.json" + ], + "urls": [ + "https://github.com/openai/codex/pull/27890" + ] + }, + "target_account": "decodexspace" +}