1
00:00:00,000 --> 00:00:00,880
Morning, everyone.

2
00:00:00,983 --> 00:00:04,640
Thanks to Jellypod for helping make this
daily show a reality.

3
00:00:04,773 --> 00:00:10,240
Today is Codex Security 0.2.0, published
on October 6.

4
00:00:10,453 --> 00:00:16,560
If you caught our earlier security episode
on 0.1.29, with the markdown severity

5
00:00:16,620 --> 00:00:21,200
rubrics and custom patch validation
prompts, this release builds on that.

6
00:00:21,380 --> 00:00:25,040
The threat model behind those policies now
gets saved too.

7
00:00:25,342 --> 00:00:26,542
Here's the exact change.

8
00:00:27,082 --> 00:00:31,162
Threat models are now saved with Standard,
Deep, and Diff scan results,

9
00:00:31,642 --> 00:00:33,362
and with generated security policies.

10
00:00:33,802 --> 00:00:38,422
That's pull request 1133, and the release
marks it as a breaking change.

11
00:00:39,002 --> 00:00:40,782
The headline command is export.

12
00:00:41,222 --> 00:00:45,642
You run codex security export, with the
artifact flag set to threat model.

13
00:00:46,162 --> 00:00:50,422
Or, if you're in the TypeScript SDK,
there's an exportArtifact helper.

14
00:00:51,062 --> 00:00:55,122
The release notes say you can export a
saved model without another model call.

15
00:00:55,375 --> 00:00:56,815
That last part is the point.

16
00:00:56,955 --> 00:01:01,455
The notes state it plainly: no additional
model invocation.

17
00:01:01,599 --> 00:01:06,415
What follows is my interpretation, not
something the release notes spell out.

18
00:01:06,595 --> 00:01:12,015
The threat model becomes something you can
store alongside a scan and pull into a PR

19
00:01:12,075 --> 00:01:17,295
summary, an audit doc, or a review
checklist without paying for another model call

20
00:01:17,348 --> 00:01:18,255
to regenerate it.

21
00:01:18,435 --> 00:01:23,855
And because it's saved with that scan's
results, the text you export is the text

22
00:01:23,887 --> 00:01:25,935
that existed when the scan ran.

23
00:01:26,358 --> 00:01:27,638
Let me walk through the workflow.

24
00:01:28,158 --> 00:01:30,418
First, run a scan in one of the three
modes.

25
00:01:30,718 --> 00:01:36,418
Something like npx, then the at openai
slash codex security package,

26
00:01:36,958 --> 00:01:40,498
then scan, with the target flag pointing
at your source directory.

27
00:01:40,978 --> 00:01:46,378
Threat modeling is part of Standard, Deep,
and Diff, so there's no extra switch to

28
00:01:46,418 --> 00:01:46,758
turn on.

29
00:01:47,438 --> 00:01:49,038
Once that finishes, you export.

30
00:01:49,578 --> 00:01:55,558
Same package through npx, the export
command, the artifact flag set to threat model,

31
00:01:56,158 --> 00:01:57,978
and the scan flag with your scan ID.

32
00:01:58,827 --> 00:02:04,167
In the SDK, you create a client, then
await client dot exportArtifact,

33
00:02:04,387 --> 00:02:07,667
passing the scan ID and the artifact name,
threat model.

34
00:02:08,267 --> 00:02:09,487
That returns the saved model.

35
00:02:10,287 --> 00:02:14,927
I'd check the SDK types for the exact
signature before wiring it into a pipeline,

36
00:02:15,447 --> 00:02:18,327
because the shape of what comes back
matters a lot in this release,

37
00:02:18,787 --> 00:02:19,747
and that's the next part.

38
00:02:20,042 --> 00:02:24,442
Right, because there are three upgrade
notes that affect anything reading these

39
00:02:24,509 --> 00:02:25,002
files.

40
00:02:25,149 --> 00:02:31,002
First, policy generation now writes a file
called threatmodel.md,

41
00:02:31,122 --> 00:02:36,602
all lowercase, instead of THREAT_MODEL.md
in capitals.

42
00:02:36,762 --> 00:02:41,482
The notes tell you to use the returned
path rather than hard coding either name.

43
00:02:41,642 --> 00:02:48,602
Second, on the SDK side, check
SecurityPolicyDraft.threatModelPath for null

44
00:02:48,671 --> 00:02:50,042
before you open the file.

45
00:02:50,242 --> 00:02:53,882
The notes don't say when it's null, so
just guard against it.

46
00:02:54,087 --> 00:02:57,674
Third, saved models can come back in two
forms.

47
00:02:57,854 --> 00:03:03,714
One is Markdown, where you get a format
field set to markdown plus a content field.

48
00:03:03,804 --> 00:03:06,554
The other is the previous structured
format.

49
00:03:06,661 --> 00:03:08,554
So a reader has to handle both.

50
00:03:08,734 --> 00:03:13,594
The good news is that existing models stay
readable and exportable without

51
00:03:13,666 --> 00:03:14,714
migration.

52
00:03:14,814 --> 00:03:18,234
You don't have to rewrite old scans to use
the new export.

53
00:03:18,630 --> 00:03:22,070
Now the caveats, because a few of them
could bite you in CI.

54
00:03:22,650 --> 00:03:28,470
The one I'd read twice: Codex Security no
longer masks diagnostic text that looks

55
00:03:28,510 --> 00:03:29,310
like credentials.

56
00:03:29,750 --> 00:03:31,710
That's pull request 1179.

57
00:03:32,250 --> 00:03:37,590
The notes say CLI output, plus saved
error, publication, and patch risk summaries,

58
00:03:38,050 --> 00:03:41,930
can contain sensitive values, and that you
should review them before sharing.

59
00:03:42,270 --> 00:03:45,530
So if you were leaning on the tool to
scrub those logs, you need to do your own

60
00:03:45,610 --> 00:03:48,330
scrubbing now, before anything gets posted
or archived.

61
00:03:48,708 --> 00:03:54,628
Second, if you run the findings service,
clients must send a Content Type header of

62
00:03:54,701 --> 00:04:01,108
application slash json to POST slash v1
slash bulk slash

63
00:04:01,197 --> 00:04:07,428
findings and POST slash v1 slash dedupe
dash groups.

64
00:04:07,575 --> 00:04:11,588
Sorry, I mean the dedupe groups endpoint,
under v1.

65
00:04:11,788 --> 00:04:18,228
A missing or different content type
returns HTTP 400, invalid_request.

66
00:04:18,588 --> 00:04:25,348
A charset parameter is accepted, so
application slash json with a charset is fine.

67
00:04:25,568 --> 00:04:29,028
Any script that posts a bare body will
break on upgrade.

68
00:04:29,322 --> 00:04:29,742
Two more.

69
00:04:30,422 --> 00:04:35,802
SDK types and CLI schemas now accept any
nonempty string for reasoning effort,

70
00:04:36,162 --> 00:04:36,942
not a fixed list.

71
00:04:37,342 --> 00:04:40,962
So if your integration validates against a
hard coded set of values,

72
00:04:41,402 --> 00:04:41,822
update it.

73
00:04:42,302 --> 00:04:45,302
The value still has to be supported by
Codex and your model provider,

74
00:04:45,362 --> 00:04:45,522
though.

75
00:04:46,422 --> 00:04:51,462
And if you export results as CSV, older
exports may have ambiguous leading

76
00:04:51,522 --> 00:04:54,362
apostrophes that can't be recovered from
the CSV alone.

77
00:04:54,942 --> 00:04:59,322
If you need those exact values, export the
original saved results as JSON.

78
00:04:59,583 --> 00:05:01,903
Now the smaller quality of life changes.

79
00:05:02,116 --> 00:05:07,583
Scans now check for exposed credentials in
source code, including unused code and

80
00:05:07,663 --> 00:05:12,063
tests, and they distinguish suspected
exposures from placeholders.

81
00:05:12,207 --> 00:05:17,503
That check runs offline, and it doesn't
try any discovered credential against a

82
00:05:17,553 --> 00:05:18,063
service.

83
00:05:18,207 --> 00:05:21,743
That's worth knowing if your security team
has rules about that.

84
00:05:22,050 --> 00:05:25,670
On the command side, the model and effort
flags are now shared.

85
00:05:25,990 --> 00:05:29,370
You can use them when generating patches,
validating findings,

86
00:05:29,710 --> 00:05:33,090
verifying fixes, or matching and comparing
saved scans.

87
00:05:33,690 --> 00:05:38,350
Deep Scan workers and patches generated
during a scan also respect your selected

88
00:05:38,410 --> 00:05:38,950
service tier.

89
00:05:39,410 --> 00:05:44,730
Patch, validation, and fix verification
commands now respect custom model providers

90
00:05:44,830 --> 00:05:46,250
and their authentication settings.

91
00:05:46,950 --> 00:05:51,230
Amazon Bedrock users get clearer
authentication errors and cost estimates for

92
00:05:51,270 --> 00:05:52,310
Daybreak Blue and Red.

93
00:05:52,910 --> 00:05:58,490
And eligible OpenAI API key users can
select a Cyber access program for each scan.

94
00:05:58,625 --> 00:06:00,065
Coverage expanded too.

95
00:06:00,305 --> 00:06:07,185
Scans now pick up C++ headers ending in
dot h h and dot h x x,

96
00:06:07,311 --> 00:06:13,985
server rendered templates in EJS, ERB, and
PHTML, and Vyper

97
00:06:14,042 --> 00:06:14,865
source files.

98
00:06:15,038 --> 00:06:19,505
Files that used to be silently skipped may
now produce findings,

99
00:06:19,558 --> 00:06:22,385
so expect your first scan after upgrading
to look different.

100
00:06:22,677 --> 00:06:24,537
And two behavior changes I like.

101
00:06:24,977 --> 00:06:30,077
On Unix, scans check that the sandbox
works before starting paid model calls,

102
00:06:30,437 --> 00:06:33,757
so a broken sandbox gets caught early
instead of mid run.

103
00:06:34,337 --> 00:06:38,217
And if you cancel follow up work,
completed results are kept.

104
00:06:38,458 --> 00:06:41,418
One more item, outside Codex Security.

105
00:06:41,518 --> 00:06:47,218
Codex CLI 0.160.1 shipped on October 5.

106
00:06:47,338 --> 00:06:53,818
It preserves SYSTEMROOT, TEMP, and TMP
when launching remote stdio MCP

107
00:06:53,898 --> 00:06:57,978
servers that have explicitly configured
remote environment variables.

108
00:06:58,122 --> 00:07:02,298
That lets Unix hosts keep the Windows
executor's startup environment.

109
00:07:02,538 --> 00:07:08,538
If you run a Unix host driving a Windows
executor, install it with npm install dash

110
00:07:08,778 --> 00:07:14,218
g at openai slash codex at 0.160.1.

111
00:07:14,450 --> 00:07:16,410
So the practical checklist is short.

112
00:07:16,870 --> 00:07:21,490
Upgrade, scan, export the threat model
once to see which format you get,

113
00:07:21,970 --> 00:07:26,230
then fix any reader that assumes the old
file name or skips the null check.

114
00:07:26,670 --> 00:07:28,610
Then audit where your CI logs go.

115
00:07:29,030 --> 00:07:29,670
That's it for today.

