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

2
00:00:01,123 --> 00:00:06,435
James, I wanna start with one tiny syntax
change that is absolutely NOT

3
00:00:06,435 --> 00:00:14,242
tiny: in Claude Code 2.

4
00:00:06,435 --> 00:00:14,242
1.120, `claude ultrareview `
became a real

5
00:00:14,242 --> 00:00:15,602
CLI command.

6
00:00:15,602 --> 00:00:20,723
Before that, `/ultrareview` lived inside
the interactive session only.

7
00:00:20,723 --> 00:00:24,322
So the old flow was: a human opens Claude
Code,

8
00:00:24,322 --> 00:00:27,357
runs the slash command,
reads the findings,

9
00:00:27,357 --> 00:00:28,796
then decides what to do.

10
00:00:28,796 --> 00:00:30,076
Now?

11
00:00:30,076 --> 00:00:33,913
You can point it at something like
`main..HEAD` from a script,

12
00:00:33,913 --> 00:00:37,197
a Make target, or a GitHub Actions job.

13
00:00:37,197 --> 00:00:42,996
That's a different beast,
mate.Wait -- `main..HEAD` is the

14
00:00:42,996 --> 00:00:44,006
part that jumps out to me.

15
00:00:44,006 --> 00:00:50,140
That's not "help me review this file."
That's "review the exact diff I'm about

16
00:00:44,006 --> 00:00:50,140
to merge."

17
00:00:50,140 --> 00:00:55,560
So we're talking about a tool moving from
sidekick to pipeline

18
00:00:50,140 --> 00:00:55,560
checkpoint.

19
00:00:55,560 --> 00:00:55,724
Exactly.

20
00:00:55,724 --> 00:00:58,362
And the practical shift is category-level.

21
00:00:58,362 --> 00:01:02,039
This isn't just a manual code-review
accelerator anymore.

22
00:01:02,039 --> 00:01:06,993
It can act like an automated PR check:
findings go to stdout,

23
00:01:06,993 --> 00:01:09,476
it returns `0` when it's clean or done,

24
00:01:09,476 --> 00:01:11,395
and `1` when it fails.

25
00:01:11,395 --> 00:01:16,351
Those two numbers -- `0` and `1` -- are
the whole ballgame in CI.

26
00:01:16,351 --> 00:01:20,653
Once a tool speaks exit code, your
pipeline listens.And that's

27
00:01:20,653 --> 00:01:21,517
where I get twitchy.

28
00:01:21,517 --> 00:01:23,519
`0` and `1` sound crisp.

29
00:01:23,519 --> 00:01:25,437
Models are NOT crisp.

30
00:01:25,437 --> 00:01:27,840
If an LLM occasionally misfires,

31
00:01:27,840 --> 00:01:30,643
and now that misfire becomes a failed
check...

32
00:01:30,643 --> 00:01:34,548
you've basically let a probabilistic
reviewer play traffic cop on your

33
00:01:34,548 --> 00:01:37,481
deploy lane.Yeah,
that's the tension.

34
00:01:37,481 --> 00:01:41,576
As a developer, I love a machine catching
something before I ship a dodgy

35
00:01:41,576 --> 00:01:44,076
change at midnight -- I've done that,

36
00:01:44,076 --> 00:01:46,000
nearly nuked a client's site once,

37
00:01:46,000 --> 00:01:47,438
not my finest hour.

38
00:01:47,438 --> 00:01:50,403
But a build breaker is different from a
helper.

39
00:01:50,403 --> 00:01:53,127
A helper can be wrong and annoying.

40
00:01:53,127 --> 00:01:58,717
A gate can be wrong and
expensive.The word you used

41
00:01:53,127 --> 00:01:58,717
there --

42
00:01:58,717 --> 00:02:02,036
"gate" -- is the memorable one for me.

43
00:02:02,036 --> 00:02:05,157
Because teams have tolerated AI as
advisor.

44
00:02:05,157 --> 00:02:07,235
Let it comment, let it suggest,

45
00:02:07,235 --> 00:02:08,116
let it draft.

46
00:02:08,116 --> 00:02:11,077
But the second it can fail the PR with
`1`,

47
00:02:11,077 --> 00:02:13,800
you're not asking "is this useful?"
anymore.

48
00:02:13,800 --> 00:02:18,137
You're asking "what level of trust does
this deserve?"

49
00:02:18,137 --> 00:02:21,396
And maybe the answer is: not full trust.

50
00:02:21,396 --> 00:02:22,395
Not at first.

51
00:02:22,395 --> 00:02:28,686
I can imagine teams using ultrareview as
a soft gate -- fail only on

52
00:02:28,686 --> 00:02:33,034
certain classes of findings,
or run it as informational for a while.

53
00:02:33,034 --> 00:02:36,874
Because chucking a model straight into
the release pipeline,

54
00:02:36,874 --> 00:02:38,555
no guardrails...

55
00:02:38,555 --> 00:02:41,777
that's like handing the keys to the ute
to someone who's still learning

56
00:02:41,777 --> 00:02:45,239
the clutch.Very Australian image,

57
00:02:45,239 --> 00:02:45,799
but yeah.

58
00:02:45,799 --> 00:02:48,041
I also think there's a cultural piece.

59
00:02:48,041 --> 00:02:52,283
If your engineers already roll their eyes
at flaky tests,

60
00:02:52,283 --> 00:02:56,043
they are going to HAATE a flaky AI review
check.

61
00:02:56,043 --> 00:03:00,800
One false block on a Friday afternoon and
suddenly everybody's got religion

62
00:03:00,800 --> 00:03:03,800
about deterministic systems.

63
00:03:00,800 --> 00:03:03,800
And fair enough.

64
00:03:03,800 --> 00:03:08,923
But still -- the fact this can now run
non-interactively matters.

65
00:03:08,923 --> 00:03:10,523
That's the line crossed.

66
00:03:10,523 --> 00:03:17,137
It's no longer "open the tool and ask
nicely." It's "wire the tool into the

67
00:03:10,523 --> 00:03:17,137
system."

68
00:03:17,137 --> 00:03:20,121
For me, the real unlock isn't even the
plain CLI command.

69
00:03:20,121 --> 00:03:22,280
It's `--json`.

70
00:03:22,280 --> 00:03:24,602
Because human-readable output is nice,

71
00:03:24,602 --> 00:03:26,926
but machine-readable output is POWER.

72
00:03:26,926 --> 00:03:33,614
`claude ultrareview main..HEAD --json >
review.

73
00:03:26,926 --> 00:03:33,614
json` means you can parse

74
00:03:33,614 --> 00:03:38,192
severities, suppress noise,
turn findings into GitHub PR annotations,

75
00:03:38,192 --> 00:03:42,358
or send a Slack alert only when something
critical shows up.

76
00:03:42,358 --> 00:03:44,714
`review.

77
00:03:42,358 --> 00:03:44,714
json` is the bit I'd stick on the
whiteboard.

78
00:03:44,714 --> 00:03:49,113
Once it's in JSON, you're not just
reading the review -- you're routing

79
00:03:49,113 --> 00:03:49,353
it.

80
00:03:49,353 --> 00:03:51,987
You can have one path for critical
findings,

81
00:03:51,987 --> 00:03:56,015
another for medium stuff, and maybe
ignore the little paper-cut warnings

82
00:03:56,015 --> 00:03:59,285
that'd otherwise make people mutter into
their coffee

83
00:03:59,285 --> 00:04:03,566
Right, but there is a very unsexy catch:
authentication.

84
00:04:03,566 --> 00:04:06,117
That GitHub Actions runner needs
credentials.

85
00:04:06,117 --> 00:04:09,400
`ANTHROPIC_API_KEY` or managed
credentials.

86
00:04:09,400 --> 00:04:11,397
Unauthenticated, it just won't work.

87
00:04:11,397 --> 00:04:13,958
And that's obvious once you say it out
loud,

88
00:04:13,958 --> 00:04:18,554
but CI failures caused by missing secrets
are the kind that eat 45 minutes

89
00:04:18,554 --> 00:04:20,479
and make you feel silly.Oh,

90
00:04:20,479 --> 00:04:21,600
100%.

91
00:04:21,600 --> 00:04:25,036
That's a classic "why's the bike not
starting" moment,

92
00:04:25,036 --> 00:04:27,195
and then you realize there's no fuel in
it.

93
00:04:27,195 --> 00:04:30,804
But the bigger engineering caution is the
JSON schema.

94
00:04:30,804 --> 00:04:32,244
It's not versioned yet.

95
00:04:32,244 --> 00:04:37,088
So if you build some deep,
brittle parser that assumes field X lives

96
00:04:37,088 --> 00:04:39,370
under object Y forever...

97
00:04:39,370 --> 00:04:44,100
mate, you're building on sand.

98
00:04:39,370 --> 00:04:44,100
The phrase "not versioned yet" is the one

99
00:04:44,100 --> 00:04:46,327
that would stop me from getting too fancy.

100
00:04:46,327 --> 00:04:48,008
I'd absolutely consume the JSON,

101
00:04:48,008 --> 00:04:48,808
but shallowly.

102
00:04:48,808 --> 00:04:50,086
Parse the basics.

103
00:04:50,086 --> 00:04:53,287
Severity, message,
maybe location if it's there.

104
00:04:53,287 --> 00:04:57,317
I would NOT build a giant internal
platform around a schema that can

105
00:04:57,317 --> 00:05:00,283
still move under me.

106
00:04:57,317 --> 00:05:00,283
Let me try to explain that back.

107
00:05:00,283 --> 00:05:04,200
You're saying: use `--json`,
but don't marry it.

108
00:05:04,200 --> 00:05:04,839
Date it.

109
00:05:04,839 --> 00:05:07,076
Keep a toothbrush at each other's place
maybe,

110
00:05:07,076 --> 00:05:12,558
but don't combine bank accounts.
That is...

111
00:05:12,558 --> 00:05:14,154
weirdly accurate.

112
00:05:14,154 --> 00:05:14,714
Yeah.

113
00:05:14,714 --> 00:05:17,514
And there are real cost questions too.

114
00:05:17,514 --> 00:05:21,191
On large diffs,
ultrareview can take 2 to 5 minutes.

115
00:05:21,191 --> 00:05:22,391
That's not instant.

116
00:05:22,391 --> 00:05:26,947
In CI terms, 5 minutes is long enough for
people to start another coffee,

117
00:05:26,947 --> 00:05:31,076
context-switch,
and then resent your tooling.

118
00:05:26,947 --> 00:05:31,076
And it's not just waiting

119
00:05:31,076 --> 00:05:32,320
around for the sake of it.

120
00:05:32,320 --> 00:05:36,687
The reason it can take that time is that
ultrareview runs parallel agents

121
00:05:36,687 --> 00:05:37,603
across the diff.

122
00:05:37,603 --> 00:05:41,598
So you're spending non-trivial compute to
get richer review coverage.

123
00:05:41,598 --> 00:05:45,444
Which, honestly,
I find appealing -- finally,

124
00:05:45,444 --> 00:05:50,360
a machine-readable gate with a bit of
depth to it -- but it's not free.

125
00:05:45,444 --> 00:05:50,360
The

126
00:05:50,360 --> 00:05:54,160
"parallel agents" part is the tradeoff in
one phrase.

127
00:05:54,160 --> 00:05:57,201
More eyes on the diff, more compute,

128
00:05:57,201 --> 00:05:58,081
more latency.

129
00:05:58,081 --> 00:06:03,067
So the question becomes: is catching one
high-severity bug before merge

130
00:06:03,067 --> 00:06:06,480
worth adding, say, 3 minutes to every PR?

131
00:06:06,480 --> 00:06:09,364
At a startup shipping 20 PRs a day,

132
00:06:09,364 --> 00:06:11,240
that adds up FAST.See,

133
00:06:11,240 --> 00:06:12,596
I'd push back a little there.

134
00:06:12,596 --> 00:06:16,917
We already tolerate slow integration
tests because they save us from

135
00:06:16,917 --> 00:06:17,719
pain later.

136
00:06:17,719 --> 00:06:22,845
If ultrareview catches one serious issue
that would've slipped into production,

137
00:06:22,845 --> 00:06:24,841
3 minutes is cheap as chips.

138
00:06:24,841 --> 00:06:29,319
The trick is making sure it's catching
that kind of issue often enough

139
00:06:29,319 --> 00:06:34,388
to earn its seat.That's the key
-- "earn its seat." Not because

140
00:06:34,388 --> 00:06:37,323
AI is magic, and not because AI is fake.

141
00:06:37,323 --> 00:06:40,285
Because every CI job has a tax.

142
00:06:40,285 --> 00:06:43,723
Time tax, compute tax, trust tax.

143
00:06:43,723 --> 00:06:46,047
`--json` makes the automation possible.

144
00:06:46,047 --> 00:06:51,342
It does not make the tradeoff disappear.

145
00:06:46,047 --> 00:06:51,342
The other thing I liked in 2.

146
00:06:46,047 --> 00:06:51,342
1.120

147
00:06:51,342 --> 00:06:55,800
and 2.

148
00:06:51,342 --> 00:06:55,800
1.121 is they quietly shaved off friction
elsewhere.

149
00:06:55,800 --> 00:07:00,535
Windows teams got a proper
quality-of-life win: Git for Windows or

150
00:06:55,800 --> 00:07:00,535
Git

151
00:07:00,535 --> 00:07:05,688
Bash is no longer required, because
Claude Code can fall back to PowerShell

152
00:07:05,688 --> 00:07:06,674
as the shell tool.

153
00:07:06,674 --> 00:07:10,912
That's not headline stuff,
but for mixed-platform teams it's huge.

154
00:07:10,912 --> 00:07:16,524
One less setup pothole.
"No longer required" is the memorable

155
00:07:16,524 --> 00:07:17,480
phrase there.

156
00:07:17,480 --> 00:07:20,716
Because if you've ever onboarded someone
on Windows and had to say,

157
00:07:20,716 --> 00:07:25,053
"Okay, now install Git Bash too," that's
one more yak to shave before

158
00:07:25,053 --> 00:07:25,997
they write any code.

159
00:07:25,997 --> 00:07:29,659
PowerShell fallback means the tool meets
the environment where it actually

160
00:07:29,659 --> 00:07:31,481
lives.

161
00:07:29,659 --> 00:07:31,481
Yep.

162
00:07:31,481 --> 00:07:36,343
And another one: the `AI_AGENT`
environment variable now gets set for

163
00:07:36,343 --> 00:07:37,233
subprocesses.

164
00:07:37,233 --> 00:07:42,239
That sounds niche, but it means the `gh`
CLI can correctly attribute

165
00:07:42,239 --> 00:07:46,352
traffic to Claude Code instead of
treating it like anonymous automation.

166
00:07:46,352 --> 00:07:50,866
Little detail, big operational
difference.The token I grab

167
00:07:50,866 --> 00:07:52,401
there is `gh`.

168
00:07:52,401 --> 00:07:56,165
Because once GitHub CLI traffic is
attributed properly,

169
00:07:56,165 --> 00:07:59,210
you're not just automating -- you're
labeling the automation.

170
00:07:59,210 --> 00:08:01,096
That's governance stuff.

171
00:08:01,096 --> 00:08:02,019
Auditability.

172
00:08:02,019 --> 00:08:06,641
Knowing whether a human ran the action or
the agent did.Right,

173
00:08:06,641 --> 00:08:09,600
and that folds into MCP getting more
production-friendly.

174
00:08:09,600 --> 00:08:10,800
Two changes.

175
00:08:10,800 --> 00:08:15,570
One: `alwaysLoad: true` keeps a server's
tools immediately available

176
00:08:15,570 --> 00:08:17,608
instead of hiding them behind search.

177
00:08:17,608 --> 00:08:22,519
Two: transient startup errors now
auto-retry up to 3 times instead of

178
00:08:22,519 --> 00:08:23,848
leaving the server disconnected.

179
00:08:23,848 --> 00:08:28,760
I really like both, because they reduce
that annoying "is the tool gone or just

180
00:08:23,848 --> 00:08:28,760
asleep?"

181
00:08:28,760 --> 00:08:29,360
feeling.

182
00:08:30,000 --> 00:08:34,959
"Up to 3 times" is exactly the sort of
number ops people care about.

183
00:08:34,959 --> 00:08:39,039
Not infinite retries,
not one brittle failure -- three.

184
00:08:39,039 --> 00:08:44,133
And `alwaysLoad: true` tells me they're
optimizing for reliability and

185
00:08:44,133 --> 00:08:46,960
predictability over clever minimalism.

186
00:08:46,960 --> 00:08:49,440
If a tool matters, make it present.

187
00:08:49,440 --> 00:08:53,244
Don't make me hunt for it.
Put all that together and the

188
00:08:53,244 --> 00:08:54,710
picture gets interesting.

189
00:08:54,710 --> 00:08:57,148
Review can be automated.

190
00:08:57,148 --> 00:08:59,581
Tool availability gets stickier.

191
00:08:59,581 --> 00:09:02,425
Attribution gets cleaner.

192
00:09:02,425 --> 00:09:04,863
Windows setup gets less annoying.

193
00:09:04,863 --> 00:09:08,147
None of those on their own is flashy.

194
00:09:08,147 --> 00:09:11,905
Together,
they make the whole system feel more...

195
00:09:11,905 --> 00:09:16,692
ready for real teams,
not just tinkerers in a terminal.

196
00:09:11,905 --> 00:09:16,692
And that lands

197
00:09:16,692 --> 00:09:18,154
us on the uncomfortable question,

198
00:09:18,154 --> 00:09:18,635
doesn't it?

199
00:09:18,635 --> 00:09:23,117
Once review, tooling,
and attribution are all automatable,

200
00:09:23,117 --> 00:09:24,320
where do you draw the line?

201
00:09:24,320 --> 00:09:26,399
At "assistant suggests"?

202
00:09:26,399 --> 00:09:28,398
At "assistant annotates"?

203
00:09:28,398 --> 00:09:31,480
Or at "assistant blocks merge"?
Yeah.

204
00:09:31,480 --> 00:09:34,439
Because the tooling line has already
moved.

205
00:09:34,439 --> 00:09:37,558
The human line -- who's allowed to decide,

206
00:09:37,558 --> 00:09:42,135
and when -- that's the one teams still
have to draw for themselves.

207
00:09:42,135 --> 00:09:42,799
That's the show.

208
00:09:42,799 --> 00:09:43,678
See ya.
