1
00:00:00,000 --> 00:00:00,878
Welcome to the show.

2
00:00:00,878 --> 00:00:06,357
James, I wanna start with a very specific
kind of misery: you refactor

3
00:00:06,357 --> 00:00:09,915
a project, hop branches,
maybe nuke a feature folder,

4
00:00:09,915 --> 00:00:11,599
come back to Claude Code...

5
00:00:11,599 --> 00:00:13,359
and it feels HAUNTED.

6
00:00:13,359 --> 00:00:15,998
It's still remembering the old transcript,

7
00:00:15,998 --> 00:00:19,600
the old task trail,
file history from before the branch swap,

8
00:00:19,600 --> 00:00:23,405
maybe even a config entry tied to a
project shape that doesn't exist

9
00:00:23,405 --> 00:00:24,075
anymore.

10
00:00:24,075 --> 00:00:28,515
And until now, the fix was the least
glamorous thing on Earth -- rummaging

11
00:00:28,515 --> 00:00:31,962
through cache directories by hand like
you're cleaning out a shed full

12
00:00:31,962 --> 00:00:37,511
of mystery bolts.The phrase
"haunted by stale transcripts" is

13
00:00:37,511 --> 00:00:38,635
painfully accurate.

14
00:00:38,635 --> 00:00:42,636
And the part I always hate is "by hand."
Not conceptually hard,

15
00:00:42,636 --> 00:00:43,437
just...

16
00:00:43,437 --> 00:00:44,157
fragile.

17
00:00:44,157 --> 00:00:46,316
You're poking around local state,

18
00:00:46,316 --> 00:00:48,237
half sure you're deleting the right thing,

19
00:00:48,237 --> 00:00:51,935
half sure you're about to remove the one
file that's secretly keeping

20
00:00:51,935 --> 00:00:54,797
the whole tool upright.

21
00:00:51,935 --> 00:00:54,797
Exactly.

22
00:00:54,797 --> 00:01:00,393
So the clean fix now is a real command:
`claude project purge `.

23
00:01:00,393 --> 00:01:03,836
And what's nice is it's not vague
housekeeping.

24
00:01:03,836 --> 00:01:08,638
It removes four concrete buckets for that
project: transcripts,

25
00:01:08,638 --> 00:01:12,157
tasks, file history,
and the project's config entry.

26
00:01:12,157 --> 00:01:13,597
That's the lot.

27
00:01:13,597 --> 00:01:14,874
Proper reset.

28
00:01:14,874 --> 00:01:17,918
Fresh paddock.Wait --
the config entry too?

29
00:01:17,918 --> 00:01:20,640
So not just the conversational memory,

30
00:01:20,640 --> 00:01:25,549
not just tasks, but the actual project
registration Claude Code has for

31
00:01:25,549 --> 00:01:28,517
that path?

32
00:01:25,549 --> 00:01:28,517
Yep, the config entry too.

33
00:01:28,517 --> 00:01:34,066
Which matters, because stale behavior
often isn't just "the bot remembers a

34
00:01:28,517 --> 00:01:34,066
chat."

35
00:01:34,066 --> 00:01:36,601
It's the whole local state bundle.

36
00:01:36,601 --> 00:01:40,608
If the project identity itself is hanging
around with old assumptions,

37
00:01:40,608 --> 00:01:45,252
you can get that uncanny valley where the
tool is technically working,

38
00:01:45,252 --> 00:01:50,441
but every suggestion is leaning on the
wrong context.

39
00:01:45,252 --> 00:01:50,441
And that "wrong context"

40
00:01:50,441 --> 00:01:52,600
bug can waste an hour easy.

41
00:01:52,600 --> 00:01:55,838
I had one of these -- not with this exact
command,

42
00:01:55,838 --> 00:01:58,675
obviously, before it existed -- but same
class of problem.

43
00:01:58,675 --> 00:02:02,277
I switched branches,
one branch had a different file layout,

44
00:02:02,277 --> 00:02:05,631
and the tool kept acting like a deleted
file still mattered.

45
00:02:05,631 --> 00:02:07,071
It wasn't crashing.

46
00:02:07,071 --> 00:02:08,511
That's the evil part.

47
00:02:08,511 --> 00:02:11,947
It was confidently helping in the WRONG
universe.

48
00:02:11,947 --> 00:02:16,707
I spent, I don't know, maybe 50 minutes
debugging my repo before realizing

49
00:02:16,707 --> 00:02:21,322
the assistant was the thing carrying
stale state.That's such

50
00:02:21,322 --> 00:02:22,162
a developer trap.

51
00:02:22,162 --> 00:02:24,803
When a tool is wrong in a loud way,

52
00:02:24,803 --> 00:02:25,924
you fix it fast.

53
00:02:25,924 --> 00:02:28,088
When it's wrong in a plausible way,

54
00:02:28,088 --> 00:02:30,887
mate,
that's where your afternoon goes to die.

55
00:02:30,887 --> 00:02:35,717
Like a trail bike with one slightly dodgy
bolt -- it'll run just well

56
00:02:35,717 --> 00:02:40,039
enough to get you stranded somewhere
inconvenient.

57
00:02:35,717 --> 00:02:40,039
The phrase for me is

58
00:02:40,039 --> 00:02:43,239
"plausibly incorrect." Those are the
expensive bugs.

59
00:02:43,239 --> 00:02:45,318
So talk me through the safety rails here,

60
00:02:45,318 --> 00:02:49,276
because "purge" is one of those words
that makes me sit up

61
00:02:45,318 --> 00:02:49,276
straight.

62
00:02:49,276 --> 00:02:49,400
Fair.

63
00:02:49,400 --> 00:02:51,797
There are four knobs people should
remember.

64
00:02:51,797 --> 00:02:56,281
`--dry-run` previews what would be
deleted before anything actually goes.

65
00:02:56,281 --> 00:02:58,762
That's the "don't be a hero" flag.

66
00:02:58,762 --> 00:03:04,039
Then `-y` or `--yes` skips the
confirmation prompt if you're automating

67
00:03:04,039 --> 00:03:05,720
or you already know what you're doing.

68
00:03:05,720 --> 00:03:10,436
`-i` or `--interactive` lets you
selectively delete,

69
00:03:10,436 --> 00:03:14,439
which is lovely if you don't want the
full scorched-earth treatment.

70
00:03:14,439 --> 00:03:19,853
And then there's `--all`, which purges
EVERY project Claude Code knows

71
00:03:19,853 --> 00:03:23,923
about.`--all` is the one that
makes me inhale through my teeth.

72
00:03:23,923 --> 00:03:26,126
Every project Claude Code knows about?

73
00:03:26,126 --> 00:03:31,442
That's not "clean this room," that's
"empty the house."Yeah,

74
00:03:31,442 --> 00:03:34,643
`--all` is not for a casual Friday
click-around.

75
00:03:34,643 --> 00:03:38,402
That's why `--dry-run` matters so much.

76
00:03:38,402 --> 00:03:42,159
If you're about to wipe every remembered
project -- transcripts,

77
00:03:42,159 --> 00:03:44,398
tasks, file history, config entries,

78
00:03:44,398 --> 00:03:49,442
the whole shebang -- you really want a
preview first.

79
00:03:44,398 --> 00:03:49,442
And `-i/--interactive`

80
00:03:49,442 --> 00:03:50,881
is the opposite vibe.

81
00:03:50,881 --> 00:03:54,083
Same purge tool, but selective.

82
00:03:54,083 --> 00:03:58,327
That's actually smart,
because stale state isn't always global.

83
00:03:58,327 --> 00:04:02,480
Sometimes one repo is cursed and the rest
are fine.

84
00:03:58,327 --> 00:04:02,480
Right.

85
00:04:02,480 --> 00:04:05,842
One repo's cactus, the others are sweet.

86
00:04:05,842 --> 00:04:08,638
And honestly,
that's why I like this update.

87
00:04:08,638 --> 00:04:12,477
It turns Claude state into something more
disposable.

88
00:04:12,477 --> 00:04:17,113
If a project gets weird, you don't treat
the weirdness like sacred archaeology.

89
00:04:17,113 --> 00:04:21,273
You purge it,
verify with `--dry-run` if you're nervous,

90
00:04:21,273 --> 00:04:24,968
and move on.That's bigger
than it sounds.

91
00:04:24,968 --> 00:04:28,932
Developer tools get better the moment
you're not afraid of their memory.

92
00:04:28,932 --> 00:04:30,931
If state can be reset cleanly,

93
00:04:30,931 --> 00:04:32,212
you experiment more.

94
00:04:32,212 --> 00:04:34,766
If state feels sticky and mysterious,

95
00:04:34,766 --> 00:04:35,963
you get conservative.

96
00:04:35,963 --> 00:04:39,562
You start working around the tool instead
of with it.Okay,

97
00:04:39,562 --> 00:04:41,362
now for the one with teeth.

98
00:04:41,362 --> 00:04:45,801
`--dangerously-skip-permissions` got more
dangerous in a very real,

99
00:04:45,801 --> 00:04:46,999
behavioral way.

100
00:04:46,999 --> 00:04:49,641
Before, even with that flag enabled,

101
00:04:49,641 --> 00:04:52,841
some protected paths could still trigger
permission prompts.

102
00:04:52,841 --> 00:04:56,083
Now it bypasses prompts for writes to
`.claude/`,

103
00:04:56,083 --> 00:04:59,002
`.git/`, `.vscode/`,
and shell config files.

104
00:04:59,002 --> 00:05:02,999
That's a major change, because those are
exactly the directories and

105
00:05:02,999 --> 00:05:06,121
files that can alter how your environment
behaves.So

106
00:05:06,121 --> 00:05:10,961
let me explain it back and you tell me if
I've got mud on the tyres: previously,

107
00:05:10,961 --> 00:05:15,913
"dangerously skip" still had a bit of
hidden adult supervision for `.git/`,

108
00:05:15,913 --> 00:05:18,472
`.vscode/`, shell config, and `.claude/`.

109
00:05:18,472 --> 00:05:24,037
Now that supervision is gone for writes
to those paths?

110
00:05:18,472 --> 00:05:24,037
Almost -- yeah,

111
00:05:24,037 --> 00:05:24,996
that's the crux.

112
00:05:24,996 --> 00:05:28,675
Those paths used to still prompt even
with the flag on.

113
00:05:28,675 --> 00:05:31,316
Now the prompts are bypassed there too.

114
00:05:31,316 --> 00:05:36,933
So if you were mentally treating the old
behavior as "dangerous,

115
00:05:31,316 --> 00:05:36,933
but with a few brake pedals left,"

116
00:05:36,933 --> 00:05:38,000
that's outdated.`.git/` is the one that
lands for me.

117
00:05:38,000 --> 00:05:39,921
If you're writing inside `.git/` without
a prompt,

118
00:05:39,921 --> 00:05:42,079
you're not just editing app code --
you're potentially changing repo

119
00:05:42,079 --> 00:05:42,079
behavior.

120
00:05:42,079 --> 00:05:51,357
`.vscode/` means editor settings.

121
00:05:51,357 --> 00:05:54,796
Shell config files mean environment
startup.

122
00:05:54,796 --> 00:05:56,474
That's not a paper cut.

123
00:05:56,474 --> 00:06:00,801
That's "the whole workshop smells like
petrol" territory.

124
00:05:56,474 --> 00:06:00,801
Exactly.

125
00:06:00,801 --> 00:06:04,878
And for CI/CD, this is where people need
to audit immediately.

126
00:06:04,878 --> 00:06:10,049
The practical effect is that the flag is
now truly non-interactive for

127
00:06:10,049 --> 00:06:11,994
those protected paths.

128
00:06:11,994 --> 00:06:16,774
So if an automation flow was quietly
relying on those prompts as an accidental

129
00:06:16,774 --> 00:06:19,118
guard rail, that guard rail is gone.

130
00:06:19,118 --> 00:06:24,566
The replacement should be explicit
path-based allow rules and deny rules,

131
00:06:24,566 --> 00:06:29,760
not vibes, not "well it used to stop and
ask."That's such

132
00:06:29,760 --> 00:06:35,482
a good distinction: if your safety model
depended on an interruption,

133
00:06:35,482 --> 00:06:38,325
you didn't really have a safety model.

134
00:06:38,325 --> 00:06:39,887
You had a speed bump.

135
00:06:39,887 --> 00:06:45,622
And speed bumps are useless if someone
just paved over them.

136
00:06:45,622 --> 00:06:45,882
Yes.

137
00:06:45,882 --> 00:06:47,082
Perfectly put.

138
00:06:47,082 --> 00:06:51,624
But there is one exception worth keeping
in the listener's head: catastrophic

139
00:06:51,624 --> 00:06:54,125
removal commands still prompt regardless.

140
00:06:54,125 --> 00:06:56,766
So "dangerously skip" is broader now,

141
00:06:56,766 --> 00:07:01,215
but it's not a total free-for-all.

142
00:06:56,766 --> 00:07:01,215
Catastrophic removal commands still

143
00:07:01,215 --> 00:07:03,243
prompt -- that's the sentence I wanted.

144
00:07:03,243 --> 00:07:06,540
Because otherwise the update sounds like
the doors have been taken off

145
00:07:06,540 --> 00:07:07,717
the hinges completely.

146
00:07:07,717 --> 00:07:08,757
They haven't.

147
00:07:08,757 --> 00:07:11,440
It's looser, not lawless.

148
00:07:08,757 --> 00:07:11,440
Right.

149
00:07:11,440 --> 00:07:13,874
Broader bypass, not absolute bypass.

150
00:07:13,874 --> 00:07:18,929
And then there's a totally different fix
that I think a lot of developers

151
00:07:18,929 --> 00:07:24,828
are gonna FEEL immediately: `claude auth
login` can now accept the OAuth

152
00:07:24,828 --> 00:07:30,202
code pasted directly into the terminal
when localhost callbacks fail.

153
00:07:30,202 --> 00:07:32,321
That is huge for WSL2.

154
00:07:32,321 --> 00:07:34,638
And SSH sessions.

155
00:07:34,638 --> 00:07:38,088
And Docker or devcontainer setups.

156
00:07:38,088 --> 00:07:43,141
Because the annoying bit there is never
the concept of OAuth -- it's

157
00:07:43,141 --> 00:07:43,920
the callback.

158
00:07:43,920 --> 00:07:48,561
The browser opens,
localhost is meant to receive the handoff,

159
00:07:48,561 --> 00:07:53,640
and in those environments the whole thing
can go a bit pear-shaped.

160
00:07:48,561 --> 00:07:53,640
Exactly.

161
00:07:53,640 --> 00:07:56,435
"Paste the code into the terminal" is not
glamorous,

162
00:07:56,435 --> 00:07:59,152
but it solves a very specific friction
point.

163
00:07:59,152 --> 00:08:02,909
WSL2 users in particular are gonna
recognize that immediately.

164
00:08:02,909 --> 00:08:06,702
Same for remote shells and containers
where localhost callback behavior

165
00:08:06,702 --> 00:08:11,963
gets weird or broken.

166
00:08:06,702 --> 00:08:11,963
It's one of those fixes that sounds tiny
in a changelog

167
00:08:11,963 --> 00:08:14,123
and massive in real life.

168
00:08:14,123 --> 00:08:19,176
Like, no one's making a movie trailer
voice about "manual OAuth code entry,"

169
00:08:19,176 --> 00:08:22,429
but when you're stuck in a devcontainer
and auth won't complete,

170
00:08:22,429 --> 00:08:25,951
that one path feels like fresh water in
the desert.

171
00:08:25,951 --> 00:08:29,402
Bit dramatic,
but you know what I mean.No,

172
00:08:29,402 --> 00:08:29,882
that's right.

173
00:08:29,882 --> 00:08:36,681
And I want to end on the quietest but
maybe most important fix:

174
00:08:29,882 --> 00:08:36,681
`allowManagedDomainsOnly`.

175
00:08:36,681 --> 00:08:40,679
There was an enterprise bug where a
higher-priority managed-settings

176
00:08:40,679 --> 00:08:44,907
source could previously let blocked
requests through if it lacked a sandbox

177
00:08:44,907 --> 00:08:45,252
block.

178
00:08:45,252 --> 00:08:46,614
That's subtle.

179
00:08:46,614 --> 00:08:50,347
It's the kind of policy-enforcement
failure nobody notices until the

180
00:08:50,347 --> 00:08:54,865
day policy enforcement actually
matters.That's the spooky

181
00:08:50,347 --> 00:08:54,865
category

182
00:08:54,865 --> 00:08:55,720
of bug, isn't it?

183
00:08:55,720 --> 00:09:04,493
Not "the app exploded," but "the rule you
thought was protecting you wasn't

184
00:08:55,720 --> 00:09:04,493
actually winning in all cases."

185
00:09:04,493 --> 00:09:08,272
Higher-priority settings sound safe by
definition,

186
00:09:08,272 --> 00:09:11,953
and yet if that source lacked a sandbox
block,

187
00:09:11,953 --> 00:09:14,511
blocked requests could slip through.

188
00:09:14,511 --> 00:09:16,110
That's...

189
00:09:16,110 --> 00:09:19,480
not flashy, but it's serious.

190
00:09:16,110 --> 00:09:19,480
Yeah.

191
00:09:19,480 --> 00:09:22,515
It's a reminder that security bugs are
often about precedence,

192
00:09:22,515 --> 00:09:23,397
not drama.

193
00:09:23,397 --> 00:09:25,159
Which setting wins.

194
00:09:25,159 --> 00:09:27,238
Which source overrides which.

195
00:09:27,238 --> 00:09:30,996
Whether a missing sandbox block creates a
hole you didn't know existed.

196
00:09:30,996 --> 00:09:33,637
Nobody brags about that fix on social
media.

197
00:09:33,637 --> 00:09:39,544
But when enterprise policy is the thing
separating "allowed" from "absolutely

198
00:09:33,637 --> 00:09:39,544
not,"

199
00:09:39,544 --> 00:09:43,262
quiet correctness matters more than shiny
features.That's

200
00:09:43,262 --> 00:09:47,713
the throughline for me: one update makes
local state disposable,

201
00:09:47,713 --> 00:09:51,233
another makes automation more honest
about risk,

202
00:09:51,233 --> 00:09:54,990
another removes auth pain in weird
environments,

203
00:09:54,990 --> 00:09:58,474
and the last one tightens policy where it
counts.

204
00:09:58,474 --> 00:10:04,350
Different fixes, same lesson -- the
dangerous stuff in tooling is usually

205
00:10:04,350 --> 00:10:05,712
the invisible stuff.

206
00:10:05,712 --> 00:10:08,481
Catch you next time.

207
00:10:05,712 --> 00:10:08,481
See ya.
