1
00:00:00,080 --> 00:00:00,600
Picture this.

2
00:00:01,140 --> 00:00:05,780
It's Monday morning, you grab a coffee,
and you find out your nightly test fixer has

3
00:00:05,820 --> 00:00:07,280
been signed out since Friday.

4
00:00:08,080 --> 00:00:10,600
Nobody got an error, nothing paged anyone.

5
00:00:11,520 --> 00:00:15,180
This is The Claude Code Changelog, brought
to you by Jellypod AI,

6
00:00:15,720 --> 00:00:18,280
and today's release is aimed squarely at
that problem.

7
00:00:18,880 --> 00:00:25,420
Claude Code 2.1.318 shipped on November 4,
2026, and the headline is that your

8
00:00:25,500 --> 00:00:27,980
login no longer expires in silence.

9
00:00:28,765 --> 00:00:34,085
And this connects to what we covered in
2.1.317, with the headless Agent SDK hooks

10
00:00:34,125 --> 00:00:36,105
and keeping unattended runs resilient.

11
00:00:36,685 --> 00:00:38,685
That was about jobs surviving failures.

12
00:00:39,025 --> 00:00:44,205
This one targets another big failure mode
in CI: a stored claude.ai login reaching

13
00:00:44,245 --> 00:00:45,225
its fixed time limit.

14
00:00:45,805 --> 00:00:46,525
Here's what changed.

15
00:00:47,165 --> 00:00:51,665
First, `claude auth status` now includes a
field called `loginExpiresAt`,

16
00:00:52,185 --> 00:00:54,725
the end date of your stored claude.ai
sign-in.

17
00:00:55,405 --> 00:01:02,045
Second, `claude -p` with `--output-format
json` now returns `credential_expires_at`

18
00:01:02,145 --> 00:01:02,825
in its results.

19
00:01:03,505 --> 00:01:08,665
Third, starting ten days before a stored
sign-in ends, `claude -p` in text mode

20
00:01:08,705 --> 00:01:10,545
prints a one line warning to stderr.

21
00:01:11,225 --> 00:01:12,305
And there's a related fix.

22
00:01:12,925 --> 00:01:17,125
Before, when a stored login hit its time
limit, sign-in just failed without

23
00:01:17,165 --> 00:01:18,025
explaining itself.

24
00:01:18,585 --> 00:01:19,405
Now it says it.

25
00:01:19,905 --> 00:01:23,445
Interactive sessions show, quote, "Login
reached its time limit,

26
00:01:23,765 --> 00:01:25,845
please run /login."

27
00:01:26,405 --> 00:01:31,085
In `claude -p`, the message says the login
reached its time limit and cannot be

28
00:01:31,125 --> 00:01:36,625
renewed, and it names two ways out:
`claude auth login`, or `claude setup-token`

29
00:01:36,965 --> 00:01:40,265
with `CLAUDE_CODE_OAUTH_TOKEN` set for
unattended jobs.

30
00:01:40,965 --> 00:01:43,165
The important bit is "cannot be renewed."

31
00:01:43,785 --> 00:01:46,785
Claude Code refreshes your login in the
background while you work,

32
00:01:47,185 --> 00:01:49,325
but that refresh doesn't push the end date
back.

33
00:01:49,845 --> 00:01:51,145
Only a new sign-in does.

34
00:01:51,848 --> 00:01:53,088
So here's how you use it.

35
00:01:53,728 --> 00:01:54,848
Simplest is a health check.

36
00:01:54,888 --> 00:02:01,128
`claude auth status` prints JSON, and it
exits 0 when you're logged in and 1 when

37
00:02:01,168 --> 00:02:01,588
you're not.

38
00:02:02,088 --> 00:02:04,428
Add `--text` if you want it human
readable.

39
00:02:05,148 --> 00:02:09,067
In a scheduled job, parse
`loginExpiresAt`, compare it to today,

40
00:02:09,488 --> 00:02:12,168
and alert your team when it's inside, say,
two weeks.

41
00:02:12,868 --> 00:02:17,388
For headless runs, read
`credential_expires_at` from the JSON output of your `claude

42
00:02:17,388 --> 00:02:20,868
-p` call and push it to whatever
monitoring you already have.

43
00:02:21,588 --> 00:02:25,008
And for permanent CI, the real fix is a
machine credential.

44
00:02:25,608 --> 00:02:29,228
Run `claude setup-token` once, store the
result as a secret,

45
00:02:29,588 --> 00:02:32,928
and export it as `CLAUDE_CODE_OAUTH_TOKEN`
in the runner.

46
00:02:33,488 --> 00:02:36,748
Then the job doesn't depend on a browser
login that will eventually run out.

47
00:02:37,617 --> 00:02:38,417
A few caveats.

48
00:02:38,997 --> 00:02:44,917
That warning goes to stderr, so if you've
got a brittle script that fails on any non

49
00:02:44,997 --> 00:02:49,777
empty stderr, the ten day warning could
break it, ironically.

50
00:02:50,317 --> 00:02:51,697
Fix that before you upgrade.

51
00:02:52,517 --> 00:02:57,617
Also, `loginExpiresAt` only covers stored
claude.ai logins.

52
00:02:58,157 --> 00:03:03,177
If you authenticate with
`ANTHROPIC_API_KEY` or a cloud provider like Bedrock or

53
00:03:03,277 --> 00:03:05,057
Vertex, it comes back null.

54
00:03:05,917 --> 00:03:11,737
And one thing the docs don't state is how
long a claude.ai login actually lasts,

55
00:03:12,197 --> 00:03:14,417
so check your own date rather than
guessing.

56
00:03:15,130 --> 00:03:16,310
Now the smaller stuff.

57
00:03:16,930 --> 00:03:23,010
Mods get an `effort` option on
`$.model.fork`, so a quick side job can run at `low`

58
00:03:23,310 --> 00:03:24,550
whatever the session's effort is.

59
00:03:25,390 --> 00:03:29,730
Started from an IDE terminal, Claude Code
no longer installs or updates the IDE

60
00:03:29,770 --> 00:03:35,070
extension, so use `/ide` from an outside
terminal or your editor's extensions view.

61
00:03:35,970 --> 00:03:40,350
A long list of fixes covers network home
directories, where `~/.claude.json`,

62
00:03:40,490 --> 00:03:44,690
settings files, and the stored login were
less likely to be wiped or replaced by an

63
00:03:44,750 --> 00:03:45,350
older copy.

64
00:03:46,070 --> 00:03:50,810
And `--continue` no longer loses earlier
conversation after a malformed tool call

65
00:03:50,870 --> 00:03:51,770
runs out of retries.

66
00:03:52,390 --> 00:03:55,010
That was a regression from 2.1.314.

67
00:03:56,050 --> 00:04:01,470
So the takeaway: run `claude auth status`
on your CI box today,

68
00:04:02,070 --> 00:04:05,370
note the date, and put a reminder ten days
before it.

69
00:04:06,030 --> 00:04:09,010
Or just set up `setup-token` and be done.

70
00:04:09,770 --> 00:04:12,010
Either way, no more surprise Mondays.

