Skip to content

Commit 456d2ea

Browse files
lee101claude
andcommitted
Codex Infinity v1.3.39 - bump version
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 parents 38fadb1 + 91ca551 commit 456d2ea

376 files changed

Lines changed: 20388 additions & 5794 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.codex/skills/codex-issue-digest/SKILL.md

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ description: Run a GitHub issue digest for openai/codex by feature-area labels,
77

88
## Objective
99

10-
Produce a concise, insight-oriented digest of `openai/codex` issues for the requested feature-area labels over the previous 24 hours by default. Honor a different duration when the user asks for one, for example "past week" or "48 hours".
10+
Produce a headline-first, insight-oriented digest of `openai/codex` issues for the requested feature-area labels over the previous 24 hours by default. Honor a different duration when the user asks for one, for example "past week" or "48 hours". Default to a summary-only response; include details only when requested.
1111

1212
Include only issues that currently have `bug` or `enhancement` plus at least one requested owner label. If the user asks for all areas or all labels, collect `bug`/`enhancement` issues across all labels.
1313

@@ -29,21 +29,46 @@ python3 .codex/skills/codex-issue-digest/scripts/collect_issue_digest.py --label
2929
Use `--window "past week"` or `--window-hours 168` when the user asks for a non-default duration. Use `--all-labels` when the user says all areas or all labels.
3030

3131
2. Use the JSON as the source of truth. It includes new issues, new issue comments, new reactions/upvotes, current labels, current reaction counts, model-ready `summary_inputs`, and detailed `digest_rows`.
32-
3. Start the report with `## Summary`, then `## Details`.
33-
4. In `## Summary`, write skim-first headlines:
34-
- Lead with the most important fact or judgment. Do not start with aggregate counts unless the aggregate itself is the story.
35-
- Make the first 1-3 bullets answer "what should owners pay attention to right now?"
36-
- Bold only the critical insight phrase in each high-priority bullet, for example `**GPT-5.5 context is the dominant pressure point**`.
37-
- Keep summary bullets short enough to scan in about 20 seconds.
38-
- Put broad stats near the end of the summary, after the owner-relevant takeaways.
39-
- Say clearly when there is nothing significant to act on.
40-
- Call out any areas or themes receiving lots of user attention.
32+
3. Choose the output mode from the user's request:
33+
- Default mode: start the report with `## Summary` and do not emit `## Details`.
34+
- Details-upfront mode: if the user asks for details, a table, a full digest, "include details", or similar, start with `## Summary`, then include `## Details`.
35+
- Follow-up details mode: if the user asks for more detail after a summary-only digest, produce `## Details` from the existing collector JSON when it is still available; otherwise rerun the collector.
36+
4. In `## Summary`, write a headline-first executive summary:
37+
- The first nonblank line under `## Summary` must be a single-line headline or judgment, not a bullet. It should be useful even if the reader stops there.
38+
- On quiet days, prefer exactly: `No major issues reported by users.` Use this when there are no elevated rows, no newly repeated theme, and nothing that needs owner action.
39+
- When users are surfacing notable issues, make the headline name the count or theme, for example `Two issues are being surfaced by users:`.
40+
- Immediately under an active headline, list only the issues or themes driving attention, ordered by importance. Start each line with the row's `attention_marker` when present, then a concise owner-readable description and inline issue refs.
41+
- Treat `🔥🔥` as headline-worthy and `🔥` as elevated. Do not add fire emoji yourself; only copy the row's `attention_marker`.
42+
- Keep any extra summary detail after the headline to 1-3 terse lines, only when it adds a decision-relevant caveat, repeated theme, or owner action.
43+
- Do not include routine counts, broad stats, or low-signal table summaries in `## Summary` unless they change the headline. Put metadata and optional counts in `## Details` or the footer.
44+
- In default mode, end the report with a concise prompt such as `Want details? I can expand this into the issue table.` Keep this separate from the summary headline so the headline stays clean.
4145
- Cluster and name themes yourself from `summary_inputs`; the collector intentionally does not hard-code issue categories.
4246
- Use a cluster only when the issues genuinely share the same product problem. If several issues merely share a broad platform or label, describe them individually.
4347
- Do not omit a repeated theme just because its individual issues fall below the details table cutoff. Several similar reports should be called out as a repeated customer concern.
4448
- For single-issue rows, summarize the concern directly instead of calling it a cluster.
4549
- Use inline numbered issue links from each relevant row's `ref_markdown`.
46-
5. In `## Details`, include a compact table only when useful:
50+
- Example quiet summary:
51+
52+
```markdown
53+
## Summary
54+
No major issues reported by users.
55+
56+
Source: collector v4, git `abc123def456`, window `2026-04-27T00:00:00Z` to `2026-04-28T00:00:00Z`.
57+
Want details? I can expand this into the issue table.
58+
```
59+
60+
- Example active summary:
61+
62+
```markdown
63+
## Summary
64+
Two issues are being surfaced by users:
65+
🔥🔥 Terminal launch hangs on startup [1](https://github.com/openai/codex/issues/123)
66+
🔥 Resume switches model providers unexpectedly [2](https://github.com/openai/codex/issues/456)
67+
68+
Source: collector v4, git `abc123def456`, window `2026-04-27T00:00:00Z` to `2026-04-28T00:00:00Z`.
69+
Want details? I can expand this into the issue table.
70+
```
71+
5. In `## Details`, when details are requested, include a compact table only when useful:
4772
- Prefer rows from `digest_rows`; include a `Refs` column using each row's `ref_markdown`.
4873
- Keep the table short; omit low-signal rows when the summary already covers them.
4974
- Use compact columns such as marker, area, type, description, interactions, and refs.
@@ -52,7 +77,7 @@ Use `--window "past week"` or `--window-hours 168` when the user asks for a non-
5277
6. Use the JSON `attention_marker` exactly. It is empty for normal rows, `🔥` for elevated rows, and `🔥🔥` for very high-attention rows. The actual cutoffs are in `attention_thresholds`.
5378
7. Use inline numbered references where a row or bullet points to issues, for example `Compaction bugs [1](https://github.com/openai/codex/issues/123), [2](https://github.com/openai/codex/issues/456)`. Do not add a separate footnotes section.
5479
8. Label `interactions` as `Interactions`; it counts posts/comments/reactions during the requested window, not unique people.
55-
9. Mention the collector `script_version`, repo checkout `git_head`, and time window in the digest footer or final line.
80+
9. Mention the collector `script_version`, repo checkout `git_head`, and time window in one compact source line. In default mode, put this before the details prompt so the final line still asks whether the user wants details. In details-upfront mode, it can be the footer.
5681

5782
## Reaction Handling
5883

@@ -64,7 +89,7 @@ GitHub issue search is still seeded by issue `updated_at`, so a purely reaction-
6489

6590
## Attention Markers
6691

67-
The collector scales attention markers by the requested time window. The baseline is 10 human user interactions for `🔥` and 20 for `🔥🔥` over 24 hours; longer or shorter windows scale those cutoffs linearly and round up. For example, a one-week report uses 70 and 140 interactions. Human user interactions are human-authored new issue posts, human-authored new comments, and human reactions created during the window, including upvotes. Bot posts and bot reactions are excluded. In prose, explain this as high user interaction rather than naming the emoji.
92+
The collector scales attention markers by the requested time window. The baseline is 5 human user interactions for `🔥` and 10 for `🔥🔥` over 24 hours; longer or shorter windows scale those cutoffs linearly and round up. For example, a one-week report uses 35 and 70 interactions. Human user interactions are human-authored new issue posts, human-authored new comments, and human reactions created during the window, including upvotes. Bot posts and bot reactions are excluded. In prose, explain this as high user interaction rather than naming the emoji.
6893

6994
## Freshness
7095

.codex/skills/codex-issue-digest/scripts/collect_issue_digest.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@
1111
from pathlib import Path
1212
from urllib.parse import quote
1313

14-
SCRIPT_VERSION = 2
14+
SCRIPT_VERSION = 4
1515
QUALIFYING_KIND_LABELS = ("bug", "enhancement")
1616
REACTION_KEYS = ("+1", "-1", "laugh", "hooray", "confused", "heart", "rocket", "eyes")
1717
BASE_ATTENTION_WINDOW_HOURS = 24.0
18-
ONE_ATTENTION_INTERACTION_THRESHOLD = 10
19-
TWO_ATTENTION_INTERACTION_THRESHOLD = 20
18+
ONE_ATTENTION_INTERACTION_THRESHOLD = 5
19+
TWO_ATTENTION_INTERACTION_THRESHOLD = 10
2020
ALL_LABEL_PHRASES = {"all", "all areas", "all labels", "all-areas", "all-labels", "*"}
2121

2222

@@ -305,6 +305,7 @@ def search_issue_numbers(queries, limit):
305305
numbers = {}
306306
for query in queries:
307307
page = 1
308+
seen_for_query = 0
308309
while True:
309310
payload = gh_json(
310311
[
@@ -315,6 +316,10 @@ def search_issue_numbers(queries, limit):
315316
"-f",
316317
f"q={query}",
317318
"-f",
319+
"sort=updated",
320+
"-f",
321+
"order=desc",
322+
"-f",
318323
"per_page=100",
319324
"-f",
320325
f"page={page}",
@@ -331,7 +336,8 @@ def search_issue_numbers(queries, limit):
331336
number = item.get("number")
332337
if isinstance(number, int):
333338
numbers[number] = str(item.get("updated_at") or "")
334-
if len(items) < 100 or len(numbers) >= limit:
339+
seen_for_query += 1
340+
if len(items) < 100 or seen_for_query >= limit:
335341
break
336342
page += 1
337343
ordered = sorted(

.codex/skills/codex-issue-digest/scripts/test_collect_issue_digest.py

Lines changed: 85 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,77 @@ def test_normalize_requested_labels_accepts_all_area_phrases():
5151
)
5252

5353

54+
def test_search_issue_numbers_requests_updated_sort(monkeypatch):
55+
calls = []
56+
57+
def fake_gh_json(args):
58+
calls.append(args)
59+
return {
60+
"items": [
61+
{"number": 1, "updated_at": "2026-04-25T00:00:00Z"},
62+
]
63+
}
64+
65+
monkeypatch.setattr(collect_issue_digest, "gh_json", fake_gh_json)
66+
67+
assert collect_issue_digest.search_issue_numbers(["query"], limit=10) == [1]
68+
assert "-f" in calls[0]
69+
assert "sort=updated" in calls[0]
70+
assert "order=desc" in calls[0]
71+
72+
73+
def test_search_issue_numbers_applies_limit_per_query(monkeypatch):
74+
calls = []
75+
76+
def fake_gh_json(args):
77+
calls.append(args)
78+
query = next(
79+
value.removeprefix("q=") for value in args if value.startswith("q=")
80+
)
81+
page = int(
82+
next(
83+
value.removeprefix("page=")
84+
for value in args
85+
if value.startswith("page=")
86+
)
87+
)
88+
base = 10_000 if query == "first" else 20_000
89+
offset = (page - 1) * 100
90+
return {
91+
"items": [
92+
{
93+
"number": base + offset + idx,
94+
"updated_at": f"2026-04-25T00:{idx:02d}:00Z",
95+
}
96+
for idx in range(100)
97+
]
98+
}
99+
100+
monkeypatch.setattr(collect_issue_digest, "gh_json", fake_gh_json)
101+
102+
collect_issue_digest.search_issue_numbers(["first", "second"], limit=150)
103+
104+
queried_pages = [
105+
(
106+
next(
107+
value.removeprefix("q=") for value in args if value.startswith("q=")
108+
),
109+
next(
110+
value.removeprefix("page=")
111+
for value in args
112+
if value.startswith("page=")
113+
),
114+
)
115+
for args in calls
116+
]
117+
assert queried_pages == [
118+
("first", "1"),
119+
("first", "2"),
120+
("second", "1"),
121+
("second", "2"),
122+
]
123+
124+
54125
def test_summarize_issue_keeps_new_comments_and_reaction_signals():
55126
since = collect_issue_digest.parse_timestamp("2026-04-25T00:00:00Z", "--since")
56127
until = collect_issue_digest.parse_timestamp("2026-04-26T00:00:00Z", "--until")
@@ -227,19 +298,19 @@ def test_parse_duration_hours_accepts_common_phrases():
227298

228299
def test_attention_thresholds_scale_by_window_length():
229300
one_day = collect_issue_digest.attention_thresholds_for_window(24)
230-
assert one_day["elevated"] == 10
231-
assert one_day["very_high"] == 20
301+
assert one_day["elevated"] == 5
302+
assert one_day["very_high"] == 10
232303

233304
half_day = collect_issue_digest.attention_thresholds_for_window(12)
234-
assert half_day["elevated"] == 5
235-
assert half_day["very_high"] == 10
305+
assert half_day["elevated"] == 3
306+
assert half_day["very_high"] == 5
236307

237308
week = collect_issue_digest.attention_thresholds_for_window(168)
238-
assert week["elevated"] == 70
239-
assert week["very_high"] == 140
240-
assert collect_issue_digest.attention_marker_for(69, week) == ""
241-
assert collect_issue_digest.attention_marker_for(107, week) == "🔥"
242-
assert collect_issue_digest.attention_marker_for(140, week) == "🔥🔥"
309+
assert week["elevated"] == 35
310+
assert week["very_high"] == 70
311+
assert collect_issue_digest.attention_marker_for(34, week) == ""
312+
assert collect_issue_digest.attention_marker_for(35, week) == "🔥"
313+
assert collect_issue_digest.attention_marker_for(70, week) == "🔥🔥"
243314

244315

245316
def test_fetch_comments_uses_since_filter_and_page_cap(monkeypatch):
@@ -300,7 +371,7 @@ def test_attention_markers_count_human_user_interactions():
300371
"user": {"login": f"user-{idx}"},
301372
"body": "same here",
302373
}
303-
for idx in range(9)
374+
for idx in range(4)
304375
]
305376
comments.append(
306377
{
@@ -322,8 +393,8 @@ def test_attention_markers_count_human_user_interactions():
322393
comment_chars=100,
323394
)
324395

325-
assert summary["user_interactions"] == 10
326-
assert summary["activity"]["new_human_comments"] == 9
396+
assert summary["user_interactions"] == 5
397+
assert summary["activity"]["new_human_comments"] == 4
327398
assert summary["attention"] is True
328399
assert summary["attention_level"] == 1
329400
assert summary["attention_marker"] == "🔥"
@@ -337,7 +408,7 @@ def test_attention_markers_count_human_user_interactions():
337408
"user": {"login": f"extra-user-{idx}"},
338409
"body": "also seeing this",
339410
}
340-
for idx in range(11)
411+
for idx in range(100, 106)
341412
)
342413

343414
summary = collect_issue_digest.summarize_issue(
@@ -350,7 +421,7 @@ def test_attention_markers_count_human_user_interactions():
350421
comment_chars=100,
351422
)
352423

353-
assert summary["user_interactions"] == 20
424+
assert summary["user_interactions"] == 10
354425
assert summary["attention_level"] == 2
355426
assert summary["attention_marker"] == "🔥🔥"
356427

codex-cli/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@codex-infinity/codex-infinity",
3-
"version": "1.3.38",
3+
"version": "1.3.39",
44
"license": "Apache-2.0",
55
"description": "Codex Infinity - a smarter coding agent that can run forever",
66
"bin": {

codex-cli/scripts/run_in_container.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,4 @@ quoted_args=""
9292
for arg in "$@"; do
9393
quoted_args+=" $(printf '%q' "$arg")"
9494
done
95-
docker exec -it "$CONTAINER_NAME" bash -c "cd \"/app$WORK_DIR\" && codex --full-auto ${quoted_args}"
95+
docker exec -it "$CONTAINER_NAME" bash -c "cd \"/app$WORK_DIR\" && codex --sandbox workspace-write --ask-for-approval on-request ${quoted_args}"

0 commit comments

Comments
 (0)