Skip to content

Commit 8e5debe

Browse files
merge upstream latest for Open-Codex 0.130.1
Merge latest upstream Codex changes while preserving Open-Codex foreground UX: non-blocking background terminal/subagent behavior, Down panel task management, statusline additions, lightweight /btw, /effort controls, npm identity, and Open-Codex commit attribution. Co-authored-by: Open Codex <hff582580@gmail.com>
2 parents 86a024a + 5b1a4c2 commit 8e5debe

717 files changed

Lines changed: 35910 additions & 11221 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: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ Use `--window "past week"` or `--window-hours 168` when the user asks for a non-
5353
## Summary
5454
No major issues reported by users.
5555

56-
Source: collector v4, git `abc123def456`, window `2026-04-27T00:00:00Z` to `2026-04-28T00:00:00Z`.
56+
Source: collector v5, git `abc123def456`, window `2026-04-27T00:00:00Z` to `2026-04-28T00:00:00Z`.
5757
Want details? I can expand this into the issue table.
5858
```
5959

@@ -65,7 +65,7 @@ Two issues are being surfaced by users:
6565
🔥🔥 Terminal launch hangs on startup [1](https://github.com/openai/codex/issues/123)
6666
🔥 Resume switches model providers unexpectedly [2](https://github.com/openai/codex/issues/456)
6767

68-
Source: collector v4, git `abc123def456`, window `2026-04-27T00:00:00Z` to `2026-04-28T00:00:00Z`.
68+
Source: collector v5, git `abc123def456`, window `2026-04-27T00:00:00Z` to `2026-04-28T00:00:00Z`.
6969
Want details? I can expand this into the issue table.
7070
```
7171
5. In `## Details`, when details are requested, include a compact table only when useful:
@@ -76,7 +76,7 @@ Want details? I can expand this into the issue table.
7676
- A clear quiet/no-concern sentence when there is no meaningful signal.
7777
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`.
7878
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.
79-
8. Label `interactions` as `Interactions`; it counts posts/comments/reactions during the requested window, not unique people.
79+
8. Label `interactions` as `Interactions`; it counts unique human GitHub users who created a new issue, added a new comment, or reacted during the requested window. Multiple posts/reactions from the same user on the same issue count once.
8080
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.
8181

8282
## Reaction Handling
@@ -89,7 +89,7 @@ GitHub issue search is still seeded by issue `updated_at`, so a purely reaction-
8989

9090
## Attention Markers
9191

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.
92+
The collector scales attention markers by the requested time window. The baseline is 5 unique human users for `🔥` and 10 unique human users 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. Unique human users are users who authored a new issue, authored a new comment, or reacted during the window, including upvotes. Multiple actions from the same user on the same issue count once. Bot posts and bot reactions are excluded. In prose, explain this as high user interaction rather than naming the emoji.
9393

9494
## Freshness
9595

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

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

14-
SCRIPT_VERSION = 4
14+
SCRIPT_VERSION = 5
1515
QUALIFYING_KIND_LABELS = ("bug", "enhancement")
1616
REACTION_KEYS = ("+1", "-1", "laugh", "hooray", "confused", "heart", "rocket", "eyes")
1717
BASE_ATTENTION_WINDOW_HOURS = 24.0
@@ -393,9 +393,15 @@ def is_bot_login(login):
393393
return bool(login) and login.lower().endswith("[bot]")
394394

395395

396-
def is_human_user(user_obj):
396+
def human_login_key(user_obj):
397397
login = extract_login(user_obj)
398-
return bool(login) and not is_bot_login(login)
398+
if not login or is_bot_login(login):
399+
return ""
400+
return login.casefold()
401+
402+
403+
def is_human_user(user_obj):
404+
return bool(human_login_key(user_obj))
399405

400406

401407
def label_names(issue):
@@ -467,22 +473,26 @@ def reaction_summary(item):
467473
def reaction_event_summary(reactions, since, until):
468474
counts = {}
469475
total = 0
476+
users = set()
470477
for reaction in reactions or []:
471478
if not isinstance(reaction, dict):
472479
continue
473480
if not is_in_window(str(reaction.get("created_at") or ""), since, until):
474481
continue
475-
if not is_human_user(reaction.get("user")):
482+
user_key = human_login_key(reaction.get("user"))
483+
if not user_key:
476484
continue
477485
content = str(reaction.get("content") or "")
478486
if not content:
479487
continue
480488
counts[content] = counts.get(content, 0) + 1
481489
total += 1
490+
users.add(user_key)
482491
return {
483492
"total": total,
484493
"counts": counts,
485494
"upvotes": counts.get("+1", 0),
495+
"users": sorted(users, key=str.casefold),
486496
}
487497

488498

@@ -618,13 +628,21 @@ def summarize_issue(
618628
new_comment_reaction_total = sum(
619629
comment["reaction_total"] for comment in new_comments
620630
)
621-
new_issue_user_interaction = new_issue and is_human_user(issue.get("user"))
631+
new_issue_user_key = human_login_key(issue.get("user")) if new_issue else ""
632+
new_issue_user_interaction = bool(new_issue_user_key)
622633
new_comment_user_interactions = sum(
623634
1 for comment in new_comments if comment["human_user_interaction"]
624635
)
625-
user_interactions = (
626-
int(new_issue_user_interaction) + new_comment_user_interactions + new_reactions
636+
interaction_user_keys = set(issue_reaction_events_summary["users"])
637+
interaction_user_keys.update(comment_reaction_events_summary["users"])
638+
if new_issue_user_key:
639+
interaction_user_keys.add(new_issue_user_key)
640+
interaction_user_keys.update(
641+
comment["author"].casefold()
642+
for comment in new_comments
643+
if comment["human_user_interaction"]
627644
)
645+
user_interactions = len(interaction_user_keys)
628646
attention_level = attention_level_for(user_interactions, attention_thresholds)
629647
attention_marker = attention_marker_for(user_interactions, attention_thresholds)
630648
updated_without_visible_new_post = (
@@ -957,6 +975,7 @@ def collect_digest(args):
957975
"New issue comments are filtered by comment creation time within the window from the fetched comment set.",
958976
"Reaction events are counted by GitHub reaction created_at timestamps for hydrated issues and fetched comments.",
959977
"Current reaction totals are standing engagement signals; new_reactions and new_upvotes are windowed activity.",
978+
"user_interactions counts unique human users per issue across new issues, new comments, and new reactions; repeated actions by the same user count once.",
960979
"The collector does not assign semantic clusters; use summary_inputs as model-ready evidence for report-time clustering.",
961980
"Pure reaction-only issues may be missed if GitHub issue search does not surface them via updated_at.",
962981
"Issues updated during the window without a new issue body or new comment are retained because label/status edits can still be useful owner signals.",

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

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,70 @@ def test_reactions_count_toward_attention_markers():
494494
assert summary["new_comments"][0]["new_upvotes"] == 0
495495

496496

497+
def test_user_interactions_are_deduped_by_human_login():
498+
since = collect_issue_digest.parse_timestamp("2026-04-25T00:00:00Z", "--since")
499+
until = collect_issue_digest.parse_timestamp("2026-04-26T00:00:00Z", "--until")
500+
501+
def comment(comment_id, login):
502+
return {
503+
"id": comment_id,
504+
"created_at": f"2026-04-25T0{comment_id + 1}:00:00Z",
505+
"updated_at": f"2026-04-25T0{comment_id + 1}:00:00Z",
506+
"user": {"login": login},
507+
"body": "same issue",
508+
}
509+
510+
def reaction(content, login, created_at="2026-04-25T10:00:00Z"):
511+
return {
512+
"content": content,
513+
"created_at": created_at,
514+
"user": {"login": login},
515+
}
516+
517+
issue = {
518+
"number": 790,
519+
"title": "Repeated pings should not boost attention",
520+
"html_url": "https://github.com/openai/codex/issues/790",
521+
"state": "open",
522+
"created_at": "2026-04-25T01:00:00Z",
523+
"updated_at": "2026-04-25T12:00:00Z",
524+
"user": {"login": "Alice"},
525+
"labels": [{"name": "bug"}, {"name": "tui"}],
526+
}
527+
comments = [comment(1, "alice"), comment(2, "ALICE"), comment(3, "bob")]
528+
comments.append(comment(4, "github-actions[bot]"))
529+
issue_reactions = [
530+
reaction("+1", "alice"),
531+
reaction("rocket", "Alice"),
532+
reaction("+1", "bob"),
533+
reaction("+1", "github-actions[bot]"),
534+
reaction("+1", "carol", created_at="2026-04-24T23:00:00Z"),
535+
]
536+
comment_reactions_by_id = {
537+
1: [reaction("heart", "alice")],
538+
2: [reaction("+1", "bob")],
539+
3: [reaction("eyes", "carol")],
540+
}
541+
542+
summary = collect_issue_digest.summarize_issue(
543+
issue,
544+
comments,
545+
["tui"],
546+
since,
547+
until,
548+
body_chars=100,
549+
comment_chars=100,
550+
issue_reaction_events=issue_reactions,
551+
comment_reactions_by_id=comment_reactions_by_id,
552+
)
553+
554+
assert summary["activity"]["new_human_comments"] == 3
555+
assert summary["new_reactions"] == 6
556+
assert summary["user_interactions"] == 3
557+
assert summary["attention"] is False
558+
assert summary["attention_marker"] == ""
559+
560+
497561
def test_digest_rows_are_table_ready_with_concise_descriptions():
498562
rows = collect_issue_digest.digest_rows(
499563
[

.github/workflows/bazel.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ jobs:
5757

5858
steps:
5959
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
60+
with:
61+
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
62+
persist-credentials: false
6063

6164
- name: Check rusty_v8 MODULE.bazel checksums
6265
if: matrix.os == 'ubuntu-24.04' && matrix.target == 'x86_64-unknown-linux-gnu'
@@ -149,6 +152,9 @@ jobs:
149152

150153
steps:
151154
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
155+
with:
156+
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
157+
persist-credentials: false
152158

153159
- name: Prepare Bazel CI
154160
id: prepare_bazel
@@ -232,6 +238,9 @@ jobs:
232238

233239
steps:
234240
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
241+
with:
242+
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
243+
persist-credentials: false
235244

236245
- name: Prepare Bazel CI
237246
id: prepare_bazel
@@ -319,6 +328,9 @@ jobs:
319328

320329
steps:
321330
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
331+
with:
332+
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
333+
persist-credentials: false
322334

323335
- name: Prepare Bazel CI
324336
id: prepare_bazel

.github/workflows/blob-size-policy.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,17 @@ jobs:
1010
steps:
1111
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
1212
with:
13+
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
1314
fetch-depth: 0
15+
persist-credentials: false
1416

1517
- name: Determine PR comparison range
1618
id: range
1719
shell: bash
1820
run: |
1921
set -euo pipefail
20-
echo "base=$(git rev-parse HEAD^1)" >> "$GITHUB_OUTPUT"
21-
echo "head=$(git rev-parse HEAD^2)" >> "$GITHUB_OUTPUT"
22+
echo "base=${{ github.event.pull_request.base.sha }}" >> "$GITHUB_OUTPUT"
23+
echo "head=${{ github.event.pull_request.head.sha }}" >> "$GITHUB_OUTPUT"
2224
2325
- name: Check changed blob sizes
2426
env:

.github/workflows/cargo-deny.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ jobs:
1515
steps:
1616
- name: Checkout
1717
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
18+
with:
19+
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
20+
persist-credentials: false
1821

1922
- name: Install Rust toolchain
2023
uses: dtolnay/rust-toolchain@a0b273b48ed29de4470960879e8381ff45632f26 # 1.93.0

.github/workflows/ci.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ jobs:
1313
steps:
1414
- name: Checkout repository
1515
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
16+
with:
17+
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
18+
persist-credentials: false
1619

1720
- name: Verify codex-rs Cargo manifests inherit workspace settings
1821
run: python3 .github/scripts/verify_cargo_workspace_manifests.py

.github/workflows/codespell.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ jobs:
1919
steps:
2020
- name: Checkout
2121
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
22+
with:
23+
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
24+
persist-credentials: false
2225
- name: Annotate locations with typos
2326
uses: codespell-project/codespell-problem-matcher@b80729f885d32f78a716c2f107b4db1025001c42 # v1.1.0
2427
- name: Codespell

.github/workflows/issue-deduplicator.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ jobs:
2020
has_matches: ${{ steps.normalize-all.outputs.has_matches }}
2121
steps:
2222
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
23+
with:
24+
persist-credentials: false
2325

2426
- name: Prepare Codex inputs
2527
env:
@@ -156,6 +158,8 @@ jobs:
156158
has_matches: ${{ steps.normalize-open.outputs.has_matches }}
157159
steps:
158160
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
161+
with:
162+
persist-credentials: false
159163

160164
- name: Prepare Codex inputs
161165
env:

.github/workflows/issue-labeler.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ jobs:
1818
codex_output: ${{ steps.codex.outputs.final-message }}
1919
steps:
2020
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
21+
with:
22+
persist-credentials: false
2123

2224
- id: codex
2325
uses: openai/codex-action@5c3f4ccdb2b8790f73d6b21751ac00e602aa0c02 # v1.7

0 commit comments

Comments
 (0)