You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Three Codex CLI surfaces are unfollowed as of upstream 0.146.0: feature-adjacent top-level config.toml keys ([agents], [[skills.config]], project_doc_*, mcp_oauth_callback_*, allow_managed_hooks_only) have no authoring path, the per-handler hook field additionalContextLimit (0.145.0) is dropped by the converter, and the checked-in Codex plugin layout (.codex-plugin/plugin.json + marketplace discovery) has no rulesync surface.
Reviewed releases 0.129.0 → 0.146.0 (2026-05-07 → 2026-07-29). Docs note: developers.openai.com/codex/* now 308-redirects to learn.chatgpt.com/docs/*; both hosts still serve content, and appending .md yields Markdown.
agents.enabled, agents.max_concurrent_threads_per_session, agents.default_subagent_model, agents.default_subagent_reasoning_effort, agents.interrupt_message — also in the subagents doc "Global settings" table.
[[skills.config]] with path/enabled — skills doc, "Enable or disable local Codex skills".
rulesync (project + global): .codex/config.toml has exactly three owners in src/features/shared/shared-config-gateway.ts — features (hooks), mcp_servers (mcp), and permissions/default_permissions plus the five CODEXCLI_OVERRIDE_KEYS (permissions). Every other top-level key is unreachable: computeCodexcliOverridePatch (src/features/permissions/codexcli-permissions.ts) warns and skips anything outside the allowlist. This contradicts the schema doc comment at src/types/permissions.ts ("Kept looseObject (verbatim passthrough) so future top-level Codex config keys can be authored without Rulesync modeling each one") — the schema accepts such keys, then the patch builder silently drops them.
2. hooks — additionalContextLimit cannot be authored
Upstream: the hooks doc documents additionalContextLimit as a per-handler field capping how much additionalContext a command hook returns before Codex spills the full text to disk (default 2500 tokens). Added in 0.145.0 (PR #34393).
rulesync (project + global): CODEXCLI_CONVERTER_CONFIG (src/features/hooks/codexcli-hooks.ts) declares stringPassthroughFields for only commandWindows and statusMessage. additionalContextLimit is a number, and tool-hooks-converter.ts has no number-passthrough kind (only boolean, string, array), so buildToolHooks drops it on both generate and import. Related: the optional top-level description metadata of hooks.json is also dropped on import (toRulesyncHooks reads only parsed.hooks).
3. Codex plugins — authorable, repo-scoped surface with no rulesync target
Upstream (plugins doc): a checked-in plugin layout — .codex-plugin/plugin.json manifest with skills, optional .mcp.json (bundled MCP server), .app.json (registered connection), and lifecycle hooks at hooks/hooks.json — plus repo-scoped discovery via $REPO_ROOT/.agents/plugins/marketplace.json (personal equivalent ~/.agents/plugins/marketplace.json). Plugin hooks default-on since 0.131.0; flag removed in 0.134.0.
rulesync: unsupported — no codexcli plugin surface. Rulesync generates every piece a plugin would bundle (skills into .agents/skills, hooks into .codex/hooks.json, MCP into .codex/config.toml) but cannot emit a plugin manifest or marketplace entry, so a team cannot author a distributable Codex plugin with rulesync.
Proposed Follow-up
Give each feature its own codexcli config-key surface rather than widening the permissions override: declare subagents: { kind: "replace-owned-keys", ownedKeys: ["agents"] } in the shared-config gateway, and extend the skills, rules, and mcp ownership entries with skills, project_doc_max_bytes/project_doc_fallback_filenames, and mcp_oauth_callback_port/mcp_oauth_callback_url respectively, each fed from a codexcli section in the matching rulesync config. At minimum, correct the misleading passthrough comment in src/types/permissions.ts so it describes the allowlist that actually exists.
Add a numberPassthroughFields kind to ToolHooksConverterConfig (mirroring the boolean/string implementations) and register additionalContextLimit for codexcli; optionally carry the top-level description metadata of hooks.json through import.
Hooks carry all eleven upstream events with correct PascalCase names, including SessionEnd and UserPromptSubmit.
The .rules generator emits the current prefix_rule(pattern=, decision=, justification=) Starlark form; permission profiles, extends, :workspace_roots, glob_scan_max_depth, and unmanaged-network-key preservation are modeled; the legacy sandbox_mode interaction warning matches upstream's note.
MCP unknown keys pass through verbatim, so auth = "chatgpt", required, and default_tools_approval_mode need no change.
Commands remain deprecated upstream and global-only in rulesync — correct.
No ignore or checks surface exists upstream — unsupported is correct.
Global dry-run writes .agents/skills/, .codex/AGENTS.md, .codex/hooks.json, .codex/config.toml, .codex/rules/rulesync.rules — all matching documented USER-scope locations.
Summary
Three Codex CLI surfaces are unfollowed as of upstream 0.146.0: feature-adjacent top-level
config.tomlkeys ([agents],[[skills.config]],project_doc_*,mcp_oauth_callback_*,allow_managed_hooks_only) have no authoring path, the per-handler hook fieldadditionalContextLimit(0.145.0) is dropped by the converter, and the checked-in Codex plugin layout (.codex-plugin/plugin.json+ marketplace discovery) has no rulesync surface.Reviewed releases 0.129.0 → 0.146.0 (2026-05-07 → 2026-07-29). Docs note:
developers.openai.com/codex/*now 308-redirects tolearn.chatgpt.com/docs/*; both hosts still serve content, and appending.mdyields Markdown.Recent Releases
SessionEndhook event (PR #33895, already followed) and configurable hook context spill limitsadditionalContextLimit(PR #34393, gap 2).hooks.jsonmetadata validation (PR #30229); 0.140.0 warned on unsupported fields (PR #26426).mcp_oauth_callback_url(PR #24120).allow_managed_hooks_only(PR #20319),mcp_oauth_callback_port(PR #20237).Gaps
1. No authoring path for feature-adjacent top-level
config.tomlkeysagents.enabled,agents.max_concurrent_threads_per_session,agents.default_subagent_model,agents.default_subagent_reasoning_effort,agents.interrupt_message— also in the subagents doc "Global settings" table.[[skills.config]]withpath/enabled— skills doc, "Enable or disable local Codex skills".project_doc_max_bytes,project_doc_fallback_filenames— AGENTS.md doc.mcp_oauth_callback_port,mcp_oauth_callback_url— MCP doc OAuth section.allow_managed_hooks_only— 0.131.0.project+global):.codex/config.tomlhas exactly three owners insrc/features/shared/shared-config-gateway.ts—features(hooks),mcp_servers(mcp), andpermissions/default_permissionsplus the fiveCODEXCLI_OVERRIDE_KEYS(permissions). Every other top-level key is unreachable:computeCodexcliOverridePatch(src/features/permissions/codexcli-permissions.ts) warns and skips anything outside the allowlist. This contradicts the schema doc comment atsrc/types/permissions.ts("KeptlooseObject(verbatim passthrough) so future top-level Codex config keys can be authored without Rulesync modeling each one") — the schema accepts such keys, then the patch builder silently drops them.2. hooks —
additionalContextLimitcannot be authoredadditionalContextLimitas a per-handler field capping how muchadditionalContexta command hook returns before Codex spills the full text to disk (default 2500 tokens). Added in 0.145.0 (PR #34393).project+global):CODEXCLI_CONVERTER_CONFIG(src/features/hooks/codexcli-hooks.ts) declaresstringPassthroughFieldsfor onlycommandWindowsandstatusMessage.additionalContextLimitis a number, andtool-hooks-converter.tshas no number-passthrough kind (only boolean, string, array), sobuildToolHooksdrops it on both generate and import. Related: the optional top-leveldescriptionmetadata ofhooks.jsonis also dropped on import (toRulesyncHooksreads onlyparsed.hooks).3. Codex plugins — authorable, repo-scoped surface with no rulesync target
.codex-plugin/plugin.jsonmanifest withskills, optional.mcp.json(bundled MCP server),.app.json(registered connection), and lifecycle hooks athooks/hooks.json— plus repo-scoped discovery via$REPO_ROOT/.agents/plugins/marketplace.json(personal equivalent~/.agents/plugins/marketplace.json). Plugin hooks default-on since 0.131.0; flag removed in 0.134.0.unsupported— no codexcli plugin surface. Rulesync generates every piece a plugin would bundle (skills into.agents/skills, hooks into.codex/hooks.json, MCP into.codex/config.toml) but cannot emit a plugin manifest or marketplace entry, so a team cannot author a distributable Codex plugin with rulesync.Proposed Follow-up
codexcliconfig-key surface rather than widening the permissions override: declaresubagents: { kind: "replace-owned-keys", ownedKeys: ["agents"] }in the shared-config gateway, and extend theskills,rules, andmcpownership entries withskills,project_doc_max_bytes/project_doc_fallback_filenames, andmcp_oauth_callback_port/mcp_oauth_callback_urlrespectively, each fed from acodexclisection in the matching rulesync config. At minimum, correct the misleading passthrough comment insrc/types/permissions.tsso it describes the allowlist that actually exists.numberPassthroughFieldskind toToolHooksConverterConfig(mirroring the boolean/string implementations) and registeradditionalContextLimitfor codexcli; optionally carry the top-leveldescriptionmetadata ofhooks.jsonthrough import.Non-gaps (verified)
SessionEndandUserPromptSubmit..rulesgenerator emits the currentprefix_rule(pattern=, decision=, justification=)Starlark form; permission profiles,extends,:workspace_roots,glob_scan_max_depth, and unmanaged-network-key preservation are modeled; the legacysandbox_modeinteraction warning matches upstream's note.auth = "chatgpt",required, anddefault_tools_approval_modeneed no change.unsupportedis correct..agents/skills/,.codex/AGENTS.md,.codex/hooks.json,.codex/config.toml,.codex/rules/rulesync.rules— all matching documented USER-scope locations.References
config.tomlkeys with no authoring path (gap 1).[agents]global settings table (gap 1).[[skills.config]]enable/disable (gap 1).project_doc_max_bytes/project_doc_fallback_filenames(gap 1).additionalContextLimitand plugin-bundled hooks (gaps 2, 3).