1
00:00:00,000 --> 00:00:01,600
Welcome to the show everyone!

2
00:00:01,680 --> 00:00:07,040
I'm Ethan Park, here with Maya, and first
off, a quick shout-out to Jellypod for

3
00:00:07,097 --> 00:00:08,800
making this daily show possible.

4
00:00:08,960 --> 00:00:15,680
Today, we are cracking open Codex CLI
version 0.141.0,

5
00:00:15,773 --> 00:00:22,400
which drops hot on the heels of the
0.140.0 release we covered last time.

6
00:00:22,600 --> 00:00:28,720
And Maya, the absolute headliner here is a
massive shift in how we handle security

7
00:00:28,800 --> 00:00:31,280
with subagents and external tools.

8
00:00:31,408 --> 00:00:38,000
They've introduced a highly precise
syntax: Tool open-parenthesis param

9
00:00:38,147 --> 00:00:41,280
colon value close-parenthesis.

10
00:00:42,419 --> 00:00:47,039
Wait, so instead of just a blanket "yes"
or "no" to letting an agent run a tool,

11
00:00:47,519 --> 00:00:50,139
we can actually inspect the arguments it's
passing?

12
00:00:50,699 --> 00:00:54,059
Like, we can look inside the payload
before it executes?

13
00:00:55,000 --> 00:00:56,080
Exactly.

14
00:00:56,140 --> 00:01:00,440
Think of it as moving from a blunt
firewall to deep packet inspection.

15
00:01:00,640 --> 00:01:05,000
Let's say you have a tool called `Agent`
that spins up subagents.

16
00:01:05,102 --> 00:01:10,600
Previously, you either allowed your main
model to spawn subagents or you blocked it

17
00:01:10,662 --> 00:01:11,240
entirely.

18
00:01:11,480 --> 00:01:16,280
Now, you can write a permission rule like
`deny Tool(Agent,

19
00:01:16,347 --> 00:01:18,280
model:opus)`.

20
00:01:18,307 --> 00:01:24,120
Or even use wildcards, like `deny
Tool(Agent, model:*opus*)`.

21
00:01:25,659 --> 00:01:28,399
Oh, that is huge for the cloud bill.

22
00:01:28,839 --> 00:01:34,000
Because Claude 3 Opus is incredible, but
at fifteen dollars per million input

23
00:01:34,079 --> 00:01:39,719
tokens, a recursive subagent loop running
Opus will drain a developer's credit card

24
00:01:39,799 --> 00:01:41,440
before they've finished their coffee.

25
00:01:42,807 --> 00:01:43,360
Literally.

26
00:01:43,500 --> 00:01:46,080
You could lose hundreds of dollars in
minutes.

27
00:01:46,208 --> 00:01:52,240
With this syntax, you can restrict
subagents to cheaper models like Haiku or Sonnet,

28
00:01:52,267 --> 00:01:56,240
while reserving the heavy-lifter models
for the top-level orchestrator.

29
00:01:56,420 --> 00:01:59,120
And it's not just for restricting models.

30
00:01:59,213 --> 00:02:01,280
Think about file system tools.

31
00:02:01,420 --> 00:02:05,520
You can write a rule like `allow
Tool(WriteFile,

32
00:02:05,648 --> 00:02:12,560
path:/tmp/*)` but block any path trying to
write

33
00:02:12,693 --> 00:02:16,880
to `/etc/*` or your project's root
directory.

34
00:02:17,219 --> 00:02:18,839
That makes a lot of sense.

35
00:02:19,319 --> 00:02:22,460
But how does this actually get evaluated
at runtime?

36
00:02:22,940 --> 00:02:27,179
Is the CLI prompting the user when a
parameter matches a blocked pattern,

37
00:02:27,340 --> 00:02:29,739
or does it just throw a hard execution
error?

38
00:02:31,000 --> 00:02:36,120
It throws a hard `PermissionDeniedError`
directly to the calling LLM.

39
00:02:36,280 --> 00:02:41,080
The neat thing is, because the error
message contains the blocked pattern,

40
00:02:41,160 --> 00:02:43,560
a smart model can actually self-correct.

41
00:02:43,773 --> 00:02:49,080
If it tries to call `WriteFile` on a
restricted system path and gets blocked,

42
00:02:49,133 --> 00:02:55,320
it can read the error, pivot, and write to
`/tmp/` instead without crashing the

43
00:02:55,377 --> 00:02:56,200
entire run.

44
00:02:57,399 --> 00:02:59,720
Okay, that's a massive win for safety.

45
00:03:00,220 --> 00:03:04,299
But let's talk about the logistics of
actually managing these configurations,

46
00:03:04,659 --> 00:03:08,020
because that's where things usually get
messy in real-world projects.

47
00:03:08,819 --> 00:03:15,379
Codex 0.141.0 changes how nested `.codex/`
configuration directories

48
00:03:15,440 --> 00:03:16,520
resolve.

49
00:03:16,579 --> 00:03:20,819
If I have a global config in my home
directory, a project-level config in my

50
00:03:20,879 --> 00:03:24,920
repository root, and maybe another one
inside a nested subdirectory,

51
00:03:25,539 --> 00:03:27,420
how does Codex decide who wins?

52
00:03:28,000 --> 00:03:31,920
Right, the classic nested configuration
resolution problem.

53
00:03:32,140 --> 00:03:37,440
Codex now uses a bottom-up,
nearest-ancestor-wins strategy.

54
00:03:37,627 --> 00:03:41,120
It starts scanning from your current
working directory upwards.

55
00:03:41,240 --> 00:03:45,440
The most local `.codex/` folder takes
precedence.

56
00:03:45,620 --> 00:03:50,480
But here is the clever part they added to
handle namespace collisions for custom

57
00:03:50,560 --> 00:03:51,480
skills.

58
00:03:51,627 --> 00:03:57,440
If you have a global skill called `deploy`
and a local project-specific skill also

59
00:03:57,493 --> 00:04:02,240
named `deploy`, Codex doesn't just
silently overwrite or crash.

60
00:04:03,000 --> 00:04:03,040
Use this voice profile for delivery: a
confident American female podcast host with

61
00:04:03,039 --> 00:04:04,280
warm, natural conversational delivery Read
this transcript exactly: Let me guess --

62
00:04:04,339 --> 00:04:05,619
it renames them?

63
00:04:06,359 --> 00:04:09,539
How does it avoid the collision without
breaking the user's workflow?

64
00:04:10,000 --> 00:04:13,200
It prefixes them using the directory name.

65
00:04:13,280 --> 00:04:18,760
So, your local project skill becomes
available under the namespace `dir:skill` --

66
00:04:18,784 --> 00:04:22,640
like `frontend:deploy` versus the global
`deploy`.

67
00:04:22,816 --> 00:04:25,280
This preserves access to both.

68
00:04:25,440 --> 00:04:29,840
You don't lose your global tooling just
because you named a local script the same

69
00:04:29,907 --> 00:04:30,320
thing.

70
00:04:32,379 --> 00:04:34,199
That's incredibly elegant.

71
00:04:34,679 --> 00:04:38,559
It reminds me of how modern monorepos
handle package scoping.

72
00:04:38,980 --> 00:04:43,619
It completely removes the fear of
"polluting" your global workspace when you're

73
00:04:43,699 --> 00:04:46,599
experimenting with local skills in a
subdirectory.

74
00:04:47,360 --> 00:04:48,600
Yes, exactly.

75
00:04:48,620 --> 00:04:52,280
And speaking of avoiding frustration, we
have to talk about some of the

76
00:04:52,330 --> 00:04:58,840
quality-of-life and stability fixes under
the hood in 0.141.0.

77
00:04:59,013 --> 00:05:03,400
First, they finally solved the mid-stream
connection drop problem.

78
00:05:03,613 --> 00:05:08,360
If you're streaming a long response from a
model and your Wi-Fi hiccups,

79
00:05:08,418 --> 00:05:11,480
previously, you lost the entire partial
response.

80
00:05:11,667 --> 00:05:13,400
It was just gone.

81
00:05:15,019 --> 00:05:15,779
Oh, I hated that.

82
00:05:16,319 --> 00:05:21,139
You'd watch fifty lines of beautifully
generated code stream onto your terminal,

83
00:05:21,599 --> 00:05:26,380
the connection would drop on line
fifty-one, and the CLI would just clear the screen

84
00:05:26,420 --> 00:05:28,219
and spit out a connection error.

85
00:05:30,000 --> 00:05:30,720
Exactly.

86
00:05:30,840 --> 00:05:33,360
Now, Codex preserves the partial stream.

87
00:05:33,573 --> 00:05:38,000
It buffers the output in real-time, so if
the connection drops,

88
00:05:38,053 --> 00:05:42,200
it saves what it got to your local context
before throwing the error.

89
00:05:42,290 --> 00:05:46,640
You can actually work with the partial
code or ask it to resume from where it left

90
00:05:46,740 --> 00:05:47,120
off.

91
00:05:47,267 --> 00:05:53,280
Along with that, they fixed WSL2 terminal
mouse wheel scrolling -- which was a

92
00:05:53,347 --> 00:05:57,760
notoriously painful bug for Windows
developers -- and they introduced a new

93
00:05:58,000 --> 00:05:59,680
`--safe-mode` flag.

94
00:06:00,419 --> 00:06:03,019
Wait, what does `--safe-mode` bypass?

95
00:06:03,299 --> 00:06:07,099
Is it just ignoring the local `.codex/`
configs we just talked about?

96
00:06:08,000 --> 00:06:09,040
Precisely.

97
00:06:09,147 --> 00:06:14,320
It completely bypasses all local
customization, custom skills,

98
00:06:14,340 --> 00:06:20,080
and custom aliases, launching the CLI with
a pure, vanilla configuration.

99
00:06:20,293 --> 00:06:26,080
If your nested directory resolution gets
too complex, or a custom skill is throwing

100
00:06:26,133 --> 00:06:32,640
an unhandled exception, you run with
`--safe-mode` to isolate whether the issue is

101
00:06:32,667 --> 00:06:35,520
in your local setup or the Codex core
engine.

102
00:06:36,379 --> 00:06:38,619
That's a classic diagnostic tool.

103
00:06:39,220 --> 00:06:44,739
It feels like Codex is really maturing
from a cool developer playground into a

104
00:06:44,819 --> 00:06:47,859
robust, enterprise-ready CLI tool chain.

105
00:06:49,000 --> 00:06:50,120
It really is.

106
00:06:50,200 --> 00:06:55,080
The granular tool permissions and the
nested config namespace safety show that they

107
00:06:55,140 --> 00:06:59,880
are thinking deeply about how teams scale
this inside complex,

108
00:06:59,947 --> 00:07:01,560
multi-layered codebases.

109
00:07:01,688 --> 00:07:06,360
That is all the time we have for today's
quick take on Codex CLI

110
00:07:06,760 --> 00:07:09,160
0.141.0.

111
00:07:09,520 --> 00:07:10,920
I'm Ethan Park.

112
00:07:11,461 --> 00:07:12,480
And I'm Maya.

113
00:07:12,500 --> 00:07:14,299
We'll see you in the next terminal
session.

