Skip to content

Prepare compact tables for file, batch, and project lists - #390

Merged
saioai merged 2 commits into
mainfrom
codex/shared-list-tables
Oct 8, 2026
Merged

saioai merged 2 commits into
mainfrom
codex/shared-list-tables

Conversation

@saioai

@saioai saioai commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

File, batch, and project lists need a compact view of each loaded API page. This change adds shared table rendering on top of the handwritten navigation prerequisite. Public API commands remain unchanged until generated page adapters are promoted through the normal compiler workflow.

What changes

  • Select ID, filename, purpose, size, and status for files.
  • Select ID and status for batches; select ID, name, and status for projects.
  • Preserve complete IDs and shorten secondary values when space is limited.
  • Use existing readable labels when a page has unfamiliar fields, actionable details, or insufficient width.
  • Keep page fetching and keyboard input outside the table renderer.
  • Propagate request cancellation through projection and nested count validation without returning partial output.
  • Leave model-specific display, selection, and navigation to the separate Models change.

The shared one-screen and tab-aware completion follow-ups are being added to #391.
Combined activation must also apply the separate quiet policy to optional summary hints while preserving records and navigation controls.
This PR prepares a dependency; it does not complete SDK-1178 or SDK-1179.

Commands

No new commands or flags. These public commands retain current-main behavior at this staged head:

openai files list
openai batches list
openai admin projects list
openai projects list
openai --format text files list
openai --format json files list

The table hook applies only when the future generated adapters select automatic terminal navigation.
Explicit formats, extraction, raw output, and redirected output retain their existing interfaces.

Code

pkg/transformers/project_list_table.go selects verified fields from one loaded page.
internal/readable/list_table.go renders aligned columns using the existing Lip Gloss dependency and terminal escaping.
pkg/custom/list_table.go connects that projection to the navigation renderer.
The generic renderer adds no requests and changes no original records.

This PR targets main after the navigation prerequisite merged in #389.
It adds no package, dependency, startup change, generated command, API reference, or generation checkpoint.
The models-only adapter, dispatch, projection, and demo scenes remain outside this change.

Tested

Current candidate ff042a3 rebases the same two table commits onto merged Navigation d866707.
Range-diff confirms both table changes remain identical.
The updated base retains Navigation's output-failure correction and current help behavior.
Thirty focused race tests produced 128 test/subtest passes, with no skips or failures.
Two public process tests produced 44 test/subtest passes.
Three independent cancellation race tests and ten subcases passed on this exact base.
The trusted-main budget passed at 21/1,000 lines.
The normal merge queue merged c65e03e after queue CI passed.
The first fully passing queue entry stalled; one normal retry used the identical reviewed source tree.
Windows Help hit an unchanged PowerShell deadline during that retry.
An unchanged Windows Help job retry passed.
No code, timeout, assertion, approval, or required check was changed to obtain the merge.
Earlier evidence below retains its original revision.

Independent review reproduced cancellation failures in resource projection and nested request-count validation.
The correction passes the caller context into existing summary checks and propagates their errors before fallback.
Three resource regressions and four independent phase probes fail before the fix and pass afterward.

For 203d7aa, 29 focused race tests passed, with 107 test/subtest passes and no skips.
The independent race overlay passed three top-level tests and ten subcases, including a 9 MiB synthetic value.
Thirty-one public scenarios matched exact output, status, requests, and cursors across main, prerequisite, and Tables: 93 CLI invocations.
All 32 packages compiled; eight contain no tests.
The trusted current-main budget passed at 21/1,000 lines, with no added generated customization.

Earlier native macOS checks at 69679c1 passed 21 command comparisons and 26 terminal-selection checks.
This correction changes no terminal selection or public activation.
Individual GJSON operations and terminal rendering remain synchronous between cancellation checks.
Native Linux and Windows cancellation behavior remains unverified.
CI passed at 203d7aa; conditional queue jobs were skipped. These checks do not claim public table activation.

Demo

This staged head has no visible public-command change to demonstrate.
Earlier local activated previews remain separate integration evidence with their original source identities.
The three-resource recorder requires a separately activated candidate after normal generated promotion.

Activation recording recipe.

BEGIN_COMMIT_OVERRIDE
refactor(lists): prepare compact table rendering for resource lists (#390)
END_COMMIT_OVERRIDE

saioai commented Oct 8, 2026

Copy link
Copy Markdown
Contributor Author

@codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-08T21:30:49.500174Z ff042a3 New commits
🔒 Security Review ✅ Completed 2026-10-08T21:31:52.730179Z ff042a3 New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 69679c182b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread pkg/transformers/project_list_table.go Outdated
@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review · Automatically triggered

Security review completed. No security issues were found in this pull request.

Reviewed commit: 69679c182b

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

saioai commented Oct 8, 2026

Copy link
Copy Markdown
Contributor Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Already looking forward to the next diff.

Reviewed commit: 203d7aa72b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@chatgpt-codex-connector

Copy link
Copy Markdown

🛡️ Codex Security Review · Automatically triggered

Security review completed. No security issues were found in this pull request.

Reviewed commit: 203d7aa72b

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

@saioai
saioai marked this pull request as ready for review October 8, 2026 20:17
@saioai
saioai requested a review from a team as a code owner October 8, 2026 20:17

@markstuart-oai markstuart-oai left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed 203d7aa72b8f2421802fe0d661640f7824cdb99f against b2d0924f451ce09a113ef1ab699f37c4375a62e0. No new blocking findings.

The table renderer preserves full IDs, escapes cells before measuring them, and falls back to labels for narrow or unsupported pages. Projection preserves actionable details through that fallback. Caller cancellation reaches the projection checks, and the navigation boundary checks it again before returning output. Rendering does not fetch pages.

This approval covers the staged table change; public-command activation remains a separate step. Source-only review: no local tests, builds, or PTY execution. Hosted test, build, lint, and baseline-consistency checks passed on this head. Queue-signal checks were skipped.

Base automatically changed from codex/list-navigation-runtime-prerequisite to main October 8, 2026 21:22
@github-actions

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

Castiron custom code

Evaluated main: d86670735891cb7cb1c948573430d3df4641c237.

✅ No new custom-code files detected.

2 mixed files remain; 0 existing customizations changed.

Compared d86670735891 → ff042a3bda90. Generated baselines verified.

2 existing customizations unchanged
  • pkg/cmd/adminorganizationcertificate.go
  • pkg/cmd/audiovoice.go

A changed generated baseline means this report cannot reliably identify which handwritten lines changed.

Inspect the custom-code diff

Download the exact patch produced by this run (requires repository access):

gh run download 37846836094 --repo openai/openai-cli \
  --name castiron-custom-code-37846836094-1 --dir /tmp/castiron-custom-code-37846836094-1
git apply --stat /tmp/castiron-custom-code-37846836094-1/custom-code.patch
cat /tmp/castiron-custom-code-37846836094-1/custom-code.patch

Or reproduce it from an SDK checkout containing the vendored reporter:

git fetch --no-tags origin d86670735891cb7cb1c948573430d3df4641c237 ff042a3bda90f51fb5f8591d08f9ce2f22d77eda
python3 scripts/castiron/custom_code_report.py report \
  --base d86670735891cb7cb1c948573430d3df4641c237 \
  --head ff042a3bda90f51fb5f8591d08f9ce2f22d77eda --fetch --require-head-hash --public \
  --out /tmp/castiron-custom-code-ff042a3bda90
cat /tmp/castiron-custom-code-ff042a3bda90/custom-code.patch

This is the current full custom patch for mixed files, not an attribution of only the handwritten lines changed by this PR.

Full report and patch

@saioai
saioai force-pushed the codex/shared-list-tables branch from 203d7aa to ff042a3 Compare October 8, 2026 21:25
assert "detail-002" in screen_text(terminal), "viewport omitted unfamiliar data"
assert terminal.child.poll() is None, "viewer exited before key delivery"
after_key = len(terminal.raw)
assert os.write(terminal.master, b"q" if scenario == "empty" else b"p") == 1, "short key write"
if not waited:
try:
os.kill(pid, signal.SIGKILL)
except ProcessLookupError:
@saioai
saioai enabled auto-merge October 8, 2026 21:27

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ff042a3bda

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread pkg/custom/list_table.go
if err != nil || !supported {
return "", false, err
}
content, fits := readable.ListTable(headers, rows, width)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Thread context through table rendering

When a loaded page contains a very large filename, project name, or ID and the caller cancels after projection completes, this call still sanitizes and width-scans every cell without consulting ctx, so renderListNavigationPage cannot observe cancellation until the entire render attempt finishes. The earlier projection fix does not cover this phase: the fresh evidence is that readable.ListTable accepts no context here. Make the renderer cancellation-aware so large supported payloads do not delay caller cancellation.

AGENTS.md reference: AGENTS.md:L105-L110

Useful? React with 👍 / 👎.

@saioai
saioai added this pull request to the merge queue Oct 8, 2026
@saioai
saioai removed this pull request from the merge queue due to a manual request Oct 8, 2026
@saioai
saioai added this pull request to the merge queue Oct 8, 2026
Merged via the queue into main with commit c65e03e Oct 8, 2026
25 checks passed
@saioai
saioai deleted the codex/shared-list-tables branch October 8, 2026 22:01
Tmwakalasya pushed a commit to Tmwakalasya/openai-cli that referenced this pull request Oct 9, 2026
…#391)

Large model lists currently fill the terminal with metadata.
This shows each model's exact ID and owner, with clear navigation for
large results.
Slow interactive requests show loading feedback instead of an
unexplained blank screen.

### What changes

- Show sorted ID and OWNER columns in automatic interactive output.
- Preserve both complete values in labeled output when the terminal is
narrow.
- Keep all accessible models, including fine-tuned IDs; unavailable
owners show `(unknown)`.
- Finish short results directly and show empty results clearly.
- Use the existing viewer for long lists: Space advances, b goes back,
and q exits.
- Explain that p prints all selected complete records, including
metadata.
- Add Models-only `--filter` and `--sort-by` controls.
- Show delayed loading feedback through slow response headers, body
reads, and retries.
- Stop feedback before rendering, preserve Ctrl+C status 130, and
restore the terminal.
- Preserve explicit formats, field extraction, pipes, and legacy limit
ordering without selection controls.

### Commands

`models list` remains the same command.
Only `--filter` and `--sort-by` are new flags.

```sh
openai models list                          # IDs and owners in an interactive terminal
openai models list --format json            # complete records
openai models list --transform id --raw-output  # IDs for a pipeline

# Match one exact ID.
openai models list --filter 'id = "demo-text-alpha"'

# Filter, sort descending, then keep three results.
openai models list --filter 'id~^demo-text-' --sort-by '~id' --max-items 3
```

Filters support exact `id=VALUE` and RE2 `id~REGEX` matching.
Matches are case-sensitive unless the regex changes that behavior.
Boolean expressions and operand lists are unsupported.
Quote the whole expression for your shell.
Operand quotes and backslash escapes are decoded before matching.

Selection sorts before `--max-items`; omitted selection retains
response-order limiting before terminal display sorting.
The limit defaults to unlimited; `-1` remains supported and `0` returns
no items.
Selection rejects `--format raw` before HTTP.
Raw output without selection retains the full response envelope.

### Code

This PR targets main `c65e03e`, after Navigation openai#389 and Tables openai#390
merged.
It preserves the reviewed Navigation completion and terminal-boundary
corrections.
Models uses the SDK's single-response pager; navigating makes no
additional API request.

`pkg/custom` owns command options, loading feedback, presentation, and
the Models viewer adapter.
`pkg/transformers` selects complete records and projects exact ID/owner
pairs.
Shared readable tables and Bubble Tea/Bubbles handle layout and
navigation.
The existing delayed-feedback helper supplies loading feedback.
Two presentation hooks stop and join its worker before results write.

Generated sources, module dependencies, entrypoint wiring, and payload
limits remain unchanged.
The one-line `.go-version` pin selects Go 1.26.9 while the Actions
version index catches up.
This security patch passes the existing vulnerability scan. Future Go
patches require updating the pin.
Universal Output composition still needs its shared policy for the
optional Details hint.
The local follow-up patch remains separate; this branch does not add
universal `--quiet`.

Images openai#394 changes the shared loading-helper signature.
Combining these PRs requires the separate verified Models caller
adaptation.
That integration patch remains local until the revised Image helper is
available in the base.

### Tested

Candidate `996def6` adds the Go 1.26.9 security pin above reviewed
runtime `70282f3`.
All five reported review findings are fixed, with regression coverage
and resolved threads.
Standard-record printing retains complete fields; Models viewer Ctrl+C
returns 130; q, Escape, and p retain status 0.

At `70282f3`, 46 focused race tests and 206 subcases passed without
failures or skips.
Independent native macOS checks reproduced both original defects and
verified the fixes, terminal restoration, and cleanup.
Additional probes preserve joined errors, writer failures, and existing
typed exit-status precedence.
The earlier `26e23a3` native checks cover narrow IDs, selection, API
errors, and the corrected single-response checker.
Normal and optimized Python checks verify key delivery and failed-write
behavior.

On Go 1.26.9, the unchanged vulnerability scan passed all nine release
targets.
Four focused Models race tests and seven subcases also passed, with no
failures or skips.
The exact native build passes. Module dependencies and counted budget
inputs remain unchanged.
CI passed for `996def6`: 21 checks passed, with two conditional skips.
The build-artifact scan used Go 1.26.9 and found no vulnerabilities
across all nine release targets.
[CI run](https://github.com/openai/openai-cli/actions/runs/37860812082)
and the trusted budget/isolation checks passed.
Merge still uses the required normal merge queue.

Earlier request-loading evidence remains tied to runtime `f739395` and
its 25 public scenarios.
The demos remain tied to `d4a2d744`; their table, navigation, and
loading paths use q and remain unchanged.
Fresh native checks cover the corrected p and Ctrl+C behavior
separately.

Justin's original hang remains unreproduced; controlled wait handling
does not establish its historical cause.
Broader generated-list activation remains separate. No live API calls
ran.
Native Linux/Windows Models behavior remains unverified.

### Demo

The recordings compare ID-only `d16c92b` with ID/owner `d4a2d744` using
48 identical synthetic records.
Both use `openai models list` on macOS arm64 with Menlo terminal replay.
The wide recording includes a controlled slow response and visible
loading feedback.
The narrow recording preserves complete ID/owner labels.
All five commands exited successfully after one identical-response
request each.
The recorder checks navigation, terminal restoration, capture bytes, and
source/binary hashes.
Author and independent reviews passed all 11 screenshots and 46 GIF
frames.
The media shows terminal replay rather than native graphical terminal
appearance.

![Before and after, with slow
loading](https://github.com/user-attachments/assets/3d5426aa-010d-4adc-887d-3500ff2df0aa)

Before:

![Before: IDs
only](https://github.com/user-attachments/assets/af89fd74-ef25-4fbf-977d-22a6fc582816)

After:

![After: IDs and
owners](https://github.com/user-attachments/assets/eca66046-82ff-4654-8259-42c12e512bb1)

[Narrow
comparison](https://github.com/user-attachments/assets/f2095fb5-c6d5-473c-b20d-9d29a093f55f).
[Recording
recipe](https://github.com/openai/openai-cli/blob/cbe90a336390688c7723537cec2c2eeb8c812868/scripts/demos/models-list-viewer/README.md).
@jbeckwith-oai jbeckwith-oai mentioned this pull request Oct 9, 2026
Tmwakalasya pushed a commit to Tmwakalasya/openai-cli that referenced this pull request Oct 19, 2026
Resumed Responses streams could report success after a reasoning, audio,
or tool event ended early.
Empty API error objects could also discard the available HTTP status.
This reports those failures while preserving partial output and
meaningful API error fields.

### What changes

- Known Responses progress events require a response completion event,
including after `--starting-after`.
- Tool completion remains separate from response completion. Unknown
events and explicit event limits keep their behavior.
- Empty API error objects use the existing status/message fallback in
structured error formats.
- Two public regression tests join the existing macOS, Linux, and
Windows dispatch checks.

### Commands

No new commands or flags.

```sh
openai responses retrieve RESPONSE_ID --stream=true --starting-after 10
openai models retrieve MODEL_ID --format-error json
```

Formats, extraction, raw output, event limits, and selected stdout data
remain available.
Incomplete resumed streams now return nonzero. Empty error objects now
include HTTP status and a useful message.

### Code

`pkg/transformers` tracks known Responses progress events.
`pkg/custom` selects the empty-error fallback without changing
meaningful API fields.
Public tests reuse the existing process helpers. The demo reuses the
shared capture helper.
Generated commands, `main.go`, dependencies, and budget policy remain
unchanged.

### Tested

On macOS ARM64, 17 new regression cases failed before the fixes; all 61
pass afterward.
Another 280 public tests and subtests pass, including large events,
cancellation, partial failures, and output formats.
Focused helper checks pass, as do 20 independent executable probes.
These runs have no skips.
Earlier baseline checks also passed binary saves and Bash/zsh
redirection at `0ca3ac7`.
Independent adversarial review found no remaining blocker in these
fixes.
CI results are pending publication.

This is a focused compatibility catch-up, not complete platform
certification.
Native Windows/Linux terminals, WSL, SSH/tmux, Fish, x64, and terminal
appearance remain incomplete.
The separate Models SIGINT correction remains with its existing owner.
Files/Batches/Projects navigation helpers remain inactive through their
generated commands.
SDK CODEOWNER review is required before merging.

### Demo

macOS Bash terminal replay against a synthetic loopback API.
Before uses `0ca3ac7`; After uses `2bf0e38`; final `61503df` adds only
the reviewed recorder.
The CLI captures stdout and stderr separately; the replay displays those
actual bytes and exit statuses.
This is not native terminal appearance evidence.

[View image:
comparison.gif](https://flow.apps.openai.org/api/v1/gh/attachments/openai/openai-cli/439/68d7c16037ee457aa33204544dad85c1.gif)

Before:

[View image:
before.png](https://flow.apps.openai.org/api/v1/gh/attachments/openai/openai-cli/439/70990718677b41828cce63f9525b4442.png)

After:

[View image:
after.png](https://flow.apps.openai.org/api/v1/gh/attachments/openai/openai-cli/439/2bd629dfb7b54e428e70726abc141375.png)

[Recording
recipe](https://github.com/openai/openai-cli/blob/61503df9a70a8f1729978bd0f902085d99bfc6d8/scripts/demos/stream-errors/README.md).

<!-- compatibility-parent: openai#265 -->
<!-- compatibility-parent: openai#266 -->
<!-- compatibility-parent: openai#276 -->
<!-- compatibility-parent: openai#278 -->
<!-- compatibility-parent: openai#279 -->
<!-- compatibility-parent: openai#289 -->
<!-- compatibility-parent: openai#389 -->
<!-- compatibility-parent: openai#390 -->
<!-- compatibility-parent: openai#391 -->
<!-- compatibility-parent: openai#392 -->
<!-- compatibility-parent: openai#395 -->
<!-- compatibility-parent: openai#397 -->

<!-- codex-thread: 01a131fd-8d19-7013-b8d9-2de3e4ab3963 -->
Tmwakalasya pushed a commit to Tmwakalasya/openai-cli that referenced this pull request Oct 19, 2026
The CLI already had tests for resource output, pagination, and streamed
text, but Windows CI did not run them.
Windows x64 and ARM64 now run those tests before changes merge.
For example, CI checks that pagination preserves item order and that
streaming failures retain text already printed.

### What changes

- Check resource summaries, pagination limits, explicit formats, unknown
fields, and partial-page failures.
- Check streamed text delivery, event identity, explicit formats,
failure diagnostics, and large events.
- Require 13 resource/navigation roots with 100 children, plus 10
streaming roots with 41 children.
- Reject missing tests, unexpected passing names, skips, failures, and
missing package passes.

### Commands

No CLI commands or flags change. The two CI selections run:

```sh
# Resource output and pagination
go test -p 2 ./cmd/openai -count=1 -timeout=3m -v -json -run '^(TestMainResourceSummariesRetainActionFields|TestMainResourceSummaryListFilesInVectorBatch|TestMainResourceSummaryPaginationPreservesOrderDuplicatesAndLimits|TestMainResourceSummaryListNoticeForMixedRecords|TestMainResourceSummaryEmptyList|TestMainResourceSummaryUnknownFieldsAndShapesFallBack|TestMainResourceSummaryExplicitFormatsAndExtractionKeepFullData|TestMainResourceSummaryListFormatsAndExtractionKeepFullItems|TestMainResourceSummaryLeavesOtherOperationsUnchanged|TestMainResourceSummaryPreservesLargeActionArguments|TestMainResourceSummaryPreservesPartialPageOnFailure|TestMainResourceSummaryWritesBeforeNextPageArrives|TestMainListNavigationNoninteractive)$'

# Streaming text output
go test -p 2 ./cmd/openai -count=1 -timeout=3m -v -json -run '^(TestMainStreamingTextArrivesBeforeCompletion|TestMainStreamingTextKeepsPartIdentityAndSnapshots|TestMainStreamingTextRetainsNontextDetails|TestMainStreamingExplicitFormatsPreserveEveryEvent|TestMainStreamingTextInterleavedChoicesKeepDetails|TestMainStreamingFailuresPreservePartialOutput|TestMainStreamingInterruptedTransportPreservesPartialOutput|TestMainStreamingFailureDiagnostics|TestMainStreamingTextDistinguishesEarlyEOFAndEmptyCompletion|TestMainStreamingTextLargeEvent)$'
```

The selectors exclude the explicit-limit streaming test and the
already-covered resumed-response dispatch test.

### Code

Only `.github/workflows/help-compatibility.yml` changes. The steps reuse
the existing PowerShell wrapper and result verifier.
The original 18 MiB resource case and large stream fixtures remain
unchanged and sequential.

PR openai#452 merged into main as `28cd2647`. This now targets that shipping
base with only the resource and streaming additions.

### Tested

- YAML parsing and all 205 verifier controls passed again after merging
main.
- Native [Windows
x64](https://github.com/openai/openai-cli/actions/runs/38482194076/job/115587500493)
and [Windows
ARM64](https://github.com/openai/openai-cli/actions/runs/38482194076/job/115587500562)
passed at `767f946`. Both used SDK 3.78.0, Go 1.26.9, and `-p 2`.
- Each architecture passed 13 resource/list roots with 100 children,
plus 10 streaming roots with 41 children.
- Every selected test ran and passed exactly once. Each suite recorded
one package pass, without selected skips or failures.
- Independent review verified the raw results and every prepared source
file against the candidate.

All six Help compatibility jobs passed. CodeQL and Castiron checks
passed.
Codex code and security reviews completed for `767f946` with no reported
findings.
[Main CI](https://github.com/openai/openai-cli/actions/runs/38482194049)
passed on its first attempt at `767f946`.

Earlier `b8407cd1` results used SDK 3.77 and remain historical.
Parent openai#452's earlier image-test timeout and unchanged passing retry
remain documented. The timeout's underlying cause remains unresolved.

For openai#389 and openai#390, this covers noninteractive preservation only.
Files, Batches, and Projects do not activate compact tables or
interactive navigation.
Shared Models behavior and helper coverage require separate evidence.
These checks do not establish terminal appearance, keyboard behavior,
WSL, shell parsing, or user-signal cancellation.
The existing POSIX `scripts/run` test skips on Windows, outside these
selections.

### Demo

No visual demo is needed for this CI-only change. CLI behavior and
appearance stay unchanged.

<!-- compatibility-parent: openai#278 -->
<!-- compatibility-parent: openai#279 -->
<!-- compatibility-parent: openai#389 -->
<!-- compatibility-parent: openai#390 -->

<!-- codex-thread: 01a131fd-7e05-7622-8102-817940a4b4ee -->
Tmwakalasya pushed a commit to Tmwakalasya/openai-cli that referenced this pull request Oct 19, 2026
)

The CLI's list and table code already had tests, but four native CI jobs
did not run them.
This adds those tests to Windows x64/ARM64, Linux ARM64, and macOS x64.
For example, CI checks that narrow tables keep complete IDs and
cancellation stops the next page request.

### What changes

- Run 34 existing library tests and their 176 named subtests on the four
selected platforms.
- Check page fetching, cancellation, error preservation, response
fields, complete IDs, Unicode widths, and narrow-table fallback.
- Require all expected results and a package pass in each of three
separate logs.
- Reject missing results, unexpected passing names, skipped tests,
failures, and incomplete packages.
- Preserve the existing 8 MiB fixture, sequential execution, two-minute
package limits, and 15-minute job limit.

### Commands

No CLI commands or flags change. These examples run one focused check
from each package:

```sh
# Check page fetching
go test -p 2 ./pkg/custom -count=1 -timeout=2m -run '^TestListPageFetcherStopsEmptyAndStalledCursors$'

# Check response fields
go test -p 2 ./pkg/transformers -count=1 -timeout=2m -run '^TestProjectListTableKnownResources$'

# Check complete IDs
go test -p 2 ./internal/readable -count=1 -timeout=2m -run '^TestListTableKeepsIDsAndFitsWidth$'
```

CI runs the full selection with JSON logs. The terminal-eligibility test
remains excluded because it requires terminal stdin and stdout.

### Code

Only `.github/workflows/help-compatibility.yml` changes. Two
platform-specific steps reuse existing tests and the result verifier.
`pkg/custom` tests navigation, `pkg/transformers` tests response fields,
and `internal/readable` tests table formatting.
The selection fills gaps in retained native evidence. Existing Linux x64
package coverage remains separate.

### Tested

- Native [Windows
x64](https://github.com/openai/openai-cli/actions/runs/38486117045/job/115600463633),
[Windows
ARM64](https://github.com/openai/openai-cli/actions/runs/38486117045/job/115600463625),
[Linux
ARM64](https://github.com/openai/openai-cli/actions/runs/38486117045/job/115600463842),
and [macOS
x64](https://github.com/openai/openai-cli/actions/runs/38486117045/job/115600463623)
passed at `dd535ed`. All used SDK 3.78.0 and Go 1.26.9.
- Each platform ran and passed 34 roots and 176 named subtests exactly
once. All three packages passed without selected skips or failures.
- Independent review checked the raw results and all 1,093 prepared
source files against the candidate.
- All 252 synthetic verifier controls and seven POSIX wrapper failure
controls passed.

All six Help compatibility jobs passed. [Main
CI](https://github.com/openai/openai-cli/actions/runs/38486117000),
CodeQL, and Castiron checks passed on their first attempts.
The new helper steps correctly skipped Linux x64 and macOS ARM64. Those
exclusions add no helper pass credit.
Named subtests include nested groups. PowerShell failure injection was
not run locally.

These library checks do not establish terminal appearance, keyboard
behavior, WSL, or race safety.
Files, Batches, and Projects still do not activate compact tables or
interactive navigation.
Shared Models interaction and terminal eligibility remain separate.

### Demo

No visual demo is needed for this CI-only change. CLI behavior and
appearance stay unchanged.

<!-- compatibility-parent: openai#389 -->
<!-- compatibility-parent: openai#390 -->

<!-- codex-thread: 01a131fd-7e05-7622-8102-817940a4b4ee -->
fredatgithub pushed a commit to fredatgithub/openai-cli that referenced this pull request Oct 19, 2026
Automated Release PR
---


##
[1.39.0](openai/openai-cli@v1.38.0...v1.39.0)
(2026-10-19)


### Features

* **admin:** add guided admin-key setup and access verification
([openai#387](openai#387))
([4183995](openai@4183995))
* **api:** add Decisions creation and hosted environment reference
([openai#437](openai#437))
([0ca3ac7](openai@0ca3ac7))
* **api:** add Decisions prompt caching options
([openai#501](openai#501))
([5031be2](openai@5031be2))
* **api:** add organization Decisions usage reporting
([openai#435](openai#435))
([ba6cb09](openai@ba6cb09))
* **api:** add prompt-based voice creation
([openai#502](openai#502))
([72f552b](openai@72f552b))
* **api:** add safety identifiers to image requests and responses
([openai#503](openai#503))
([b624c9f](openai@b624c9f))
* **api:** configure Decisions when accepting Live SIP calls
([openai#505](openai#505))
([e17ac83](openai@e17ac83))
* **api:** support project API key scope updates
([openai#478](openai#478))
([7afecce](openai@7afecce))
* **api:** support updating project API key expiry
([openai#462](openai#462))
([97b43f2](openai@97b43f2))
* **audio:** add speech workflows, local history, playback, export, and
readable transcripts
([openai#403](openai#403))
([fe17bcb](openai@fe17bcb))
* **batches:** add waiting, result collection, and safe downloads
([openai#388](openai#388))
([ecaf876](openai@ecaf876))
* **cli:** add scoped error recovery and optional shell typo suggestions
([openai#409](openai#409))
([a81ec27](openai@a81ec27))
* **cli:** show a welcome card during bare interactive startup
([openai#401](openai#401))
([024dbaa](openai@024dbaa))
* **files:** add get and download routes with positional uploads
([openai#397](openai#397))
([e689398](openai@e689398))
* **help:** show complete help consistently and improve flag diagnostics
([openai#384](openai#384))
([6fcc478](openai@6fcc478))
* **images:** add interactive and opt-in Konsole previews
([openai#371](openai#371))
([d3bc819](openai@d3bc819))
* **images:** retain picker drafts and keep failed requests editable
([openai#394](openai#394))
([1dc9d3d](openai@1dc9d3d))
* **models:** add filtered ID and owner lists with interactive
navigation ([openai#391](openai#391))
([86502b0](openai@86502b0))
* **output:** add quiet and verbose controls
([openai#392](openai#392))
([866d877](openai@866d877))
* **tokenizer:** add offline token inspection and local Codex guidance
([openai#386](openai#386))
([217ff2e](openai@217ff2e))


### Bug Fixes

* **autocomplete:** preserve colon argument boundaries
([openai#413](openai#413))
([5739ce0](openai@5739ce0))
* **autocomplete:** preserve quoted and Unicode filenames during Bash
completion ([openai#446](openai#446))
([6ec7646](openai@6ec7646))
* **autocomplete:** preserve quoted Bash command prefixes
([openai#399](openai#399))
([c3c66c4](openai@c3c66c4))
* **autocomplete:** restore Fish 3 completion and literal filename
prefixes ([openai#447](openai#447))
([f93670c](openai@f93670c))
* **ci:** decode SDK cross-link events as UTF-8
([openai#457](openai#457))
([af0e8a0](openai@af0e8a0))
* **cli:** emit finite JSON arrays; use --format jsonl for independent
records ([openai#407](openai#407))
([b93e41e](openai@b93e41e))
* **cli:** wait briefly for Windows piped input
([openai#485](openai#485))
([8b40840](openai@8b40840))
* **errors:** preserve incomplete resumed-stream failures and empty API
error details ([openai#439](openai#439))
([e8ffaab](openai@e8ffaab))
* **help:** preserve literal flag values and quoted Bash file completion
([openai#440](openai#440))
([47d6a16](openai@47d6a16))
* **images:** preserve reserved probe directories during Windows image
saves ([openai#470](openai#470))
([e330cc2](openai@e330cc2))
* **images:** retain saved-file recovery guidance after cancellation
([openai#442](openai#442))
([337a7e4](openai@337a7e4))
* **io:** preserve explicit stdin, stream events promptly, and protect
incomplete downloads
([openai#395](openai#395))
([390a9c3](openai@390a9c3))
* **models:** finish SIGINT shutdown with status 130
([openai#441](openai#441))
([673c5eb](openai@673c5eb))
* **output:** keep redirected results undecorated and preserve stream
cleanup ([openai#392](openai#392))
([866d877](openai@866d877))
* **output:** send successful API save receipts to stderr
([openai#395](openai#395))
([390a9c3](openai@390a9c3))
* **tokenizer:** preserve Windows Unicode input and split terminal
replies ([openai#454](openai#454))
([911218a](openai@911218a))


### Chores

* **api:** clarify Decisions request and response fields
([openai#476](openai#476))
([8301197](openai@8301197))
* **api:** correct the shida Live voice name
([openai#430](openai#430))
([193ee5b](openai@193ee5b))
* **api:** document 128-character safety identifiers
([openai#428](openai#428))
([a6bf1af](openai@a6bf1af))
* **api:** document beta pagination validation and migration
([openai#431](openai#431))
([729045e](openai@729045e))
* **api:** document beta session spending controls
([openai#432](openai#432))
([47df976](openai@47df976))
* **api:** document billing_not_active session errors
([openai#429](openai#429))
([8f26fe4](openai@8f26fe4))
* **api:** document detailed safety alert explanations
([openai#434](openai#434))
([2b61ced](openai@2b61ced))
* **api:** document Files API rate-limit responses
([openai#427](openai#427))
([88cd309](openai@88cd309))
* **api:** document image tool error and moderation details
([openai#451](openai#451))
([53b3b6e](openai@53b3b6e))
* **api:** document Live audio fixture events in the API reference
([openai#481](openai#481))
([38c82ce](openai@38c82ce))
* **api:** document OCI external-storage providers
([openai#433](openai#433))
([4f1f7df](openai@4f1f7df))
* **api:** document Realtime response error messages
([openai#479](openai#479))
([ec8d114](openai@ec8d114))
* **api:** document regional processing residency values
([openai#477](openai#477))
([75865b6](openai@75865b6))
* **api:** document snapshot lifecycle status values and events
([openai#415](openai#415))
([53828f0](openai@53828f0))
* **api:** document vault updates and metadata filters
([openai#426](openai#426))
([b724518](openai@b724518))
* **api:** use neutral moderation examples
([openai#518](openai#518))
([180544a](openai@180544a))
* clarify Live limits and refresh generated-file verification
([openai#510](openai#510))
([9cddd6b](openai@9cddd6b))
* **deps:** bump charm.land/bubbletea/v2 from 2.0.10 to 2.1.0 in the
go-minor-and-patch group across 1 directory
([openai#539](openai#539))
([37d5e5c](openai@37d5e5c))
* **deps:** bump the codeql group across 1 directory with 2 updates
([openai#543](openai#543))
([9023b9e](openai@9023b9e))
* **deps:** bump the go-minor-and-patch group across 1 directory with 5
updates ([openai#444](openai#444))
([263dadd](openai@263dadd))
* **deps:** bump the golang-x group across 1 directory with 2 updates
([openai#540](openai#540))
([52f0ad0](openai@52f0ad0))
* **deps:** update openai-go to v3.74.0
([openai#393](openai#393))
([e32158e](openai@e32158e))
* **deps:** update openai-go to v3.75.0
([openai#412](openai#412))
([077ae69](openai@077ae69))
* **deps:** update openai-go to v3.77.0
([openai#414](openai#414))
([835de59](openai@835de59))
* **deps:** update openai-go to v3.78.0
([openai#450](openai#450))
([8f79e98](openai@8f79e98))
* **deps:** update openai-go to v3.79.0
([openai#507](openai#507))
([0828c79](openai@0828c79))
* **deps:** update openai-go to v3.81.0
([openai#516](openai#516))
([6c26343](openai@6c26343))
* **deps:** update openai-go to v3.82.0
([openai#532](openai#532))
([00add07](openai@00add07))
* restore generated reporting tools without behavior changes
([openai#475](openai#475))
([c12cd56](openai@c12cd56))


### Documentation

* define CLI layout migration and compatibility contract
([openai#486](openai#486))
([e9ad31e](openai@e9ad31e))
* **windows:** explain JSON stderr capture in Windows PowerShell 5.1
([openai#443](openai#443))
([960af77](openai@960af77))


### Refactors

* **batches:** separate local workflows from assembly policy
([openai#547](openai#547))
([0486923](openai@0486923))
* extract CLI invocation runner into internal app
([openai#488](openai#488))
([ee7a731](openai@ee7a731))
* **files:** separate handwritten workflows and shared shell helpers
([openai#546](openai#546))
([a6bfb0b](openai@a6bfb0b))
* **input:** move non-consuming piped input probes
([openai#529](openai#529))
([904c95d](openai@904c95d))
* isolate browser platform handling in internal/terminal
([openai#504](openai#504))
([9d304ca](openai@9d304ca))
* isolate command-tree organization
([openai#515](openai#515))
([b5cc7a8](openai@b5cc7a8))
* isolate generated tokenizer tables
([openai#496](openai#496))
([efda414](openai@efda414))
* isolate the Codex command feature
([openai#509](openai#509))
([a6530ae](openai@a6530ae))
* isolate the manpage command feature
([openai#514](openai#514))
([7617d3d](openai@7617d3d))
* isolate the shared terminal output runtime
([openai#512](openai#512))
([d93d0d0](openai@d93d0d0))
* isolate the tokenizer command feature
([openai#513](openai#513))
([fb023ee](openai@fb023ee))
* keep mTLS transport construction in internal/request
([openai#522](openai#522))
([393e1ae](openai@393e1ae))
* keep request-input help with its renderer
([openai#519](openai#519))
([5791763](openai@5791763))
* **lists:** add shared paged-list navigation runtime
([openai#389](openai#389))
([d866707](openai@d866707))
* **lists:** prepare compact table rendering for resource lists
([openai#390](openai#390))
([c65e03e](openai@c65e03e))
* move command recovery into help
([openai#517](openai#517))
([5662bc2](openai@5662bc2))
* move response transformations into internal output
([openai#487](openai#487))
([55ebd62](openai@55ebd62))
* **output:** move finite JSON list framing and paging
([openai#537](openai#537))
([ee77628](openai@ee77628))
* **output:** move lazy transformation iterator
([openai#535](openai#535))
([ad22022](openai@ad22022))
* **output:** move pager and stdout streaming runtime
([openai#536](openai#536))
([cb5a5a8](openai@cb5a5a8))
* **output:** move readable list and stream rendering
([openai#538](openai#538))
([8b304b0](openai@8b304b0))
* **output:** move result formatting and format selection
([openai#534](openai#534))
([50db1df](openai@50db1df))
* **request:** extract piped input reading and merge policy
([openai#528](openai#528))
([068bddc](openai@068bddc))
* **request:** move default client options and URL validation
([openai#530](openai#530))
([211f056](openai@211f056))
* **request:** move file expansion and single-use stdin
([openai#526](openai#526))
([8be3c0b](openai@8be3c0b))
* **request:** move multipart encoding and owned uploads
([openai#524](openai#524))
([73f9a1f](openai@73f9a1f))
* **request:** move shared flag and stdin preparation
([openai#533](openai#533))
([8e64575](openai@8e64575))
* **request:** move stdin provenance and input policies
([openai#525](openai#525))
([ac5aa07](openai@ac5aa07))
* **request:** move streaming mode resolution
([openai#527](openai#527))
([64ae997](openai@64ae997))
* **request:** separate final encoding from feature hooks
([openai#531](openai#531))
([711596c](openai@711596c))
* separate generated API commands from handwritten CLI code
([openai#500](openai#500))
([d44fb85](openai@d44fb85))
* separate generated commands from CLI compatibility behavior
([openai#474](openai#474))
([08df3f6](openai@08df3f6))
* share literal request headers through internal/request
([openai#521](openai#521))
([a9f35b9](openai@a9f35b9))
* share output writing and error classification
([openai#506](openai#506))
([bce2ab8](openai@bce2ab8))
* share root request flags and mTLS configuration
([openai#523](openai#523))
([a718ab6](openai@a718ab6))
* share terminal color and presentation policy
([openai#508](openai#508))
([575d494](openai@575d494))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: openai-sdks[bot] <284451331+openai-sdks[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants