4 Commits

  • chore: document intentional await-holding cases (#18423)
    ## Why
    
    This PR prepares the stack to enable Clippy await-holding lints that
    were left disabled in #18178. The mechanical lock-scope cleanup is
    handled separately; this PR is the documentation/configuration layer for
    the remaining await-across-guard sites.
    
    Without explicit annotations, reviewers and future maintainers cannot
    tell whether an await-holding warning is a real concurrency smell or an
    intentional serialization boundary.
    
    ## What changed
    
    - Configures `clippy.toml` so `await_holding_invalid_type` also covers
    `tokio::sync::{MutexGuard,RwLockReadGuard,RwLockWriteGuard}`.
    - Adds targeted `#[expect(clippy::await_holding_invalid_type, reason =
    ...)]` annotations for intentional async guard lifetimes.
    - Documents the main categories of intentional cases: active-turn state
    transitions that must remain atomic, session-owned MCP manager accesses,
    remote-control websocket serialization, JS REPL kernel/process
    serialization, OAuth persistence, external bearer token refresh
    serialization, and tests that intentionally serialize shared global or
    session-owned state.
    - For external bearer token refresh, documents the existing
    serialization boundary: holding `cached_token` across the provider
    command prevents concurrent cache misses from starting duplicate refresh
    commands, and the current behavior is small enough that an explicit
    expectation is easier to maintain than adding another synchronization
    primitive.
    
    ## Verification
    
    - `cargo clippy -p codex-login --all-targets`
    - `cargo clippy -p codex-connectors --all-targets`
    - `cargo clippy -p codex-core --all-targets`
    - The follow-up PR #18698 enables `await_holding_invalid_type` and
    `await_holding_lock` as workspace `deny` lints, so any undocumented
    remaining offender will fail Clippy.
    
    ---
    [//]: # (BEGIN SAPLING FOOTER)
    Stack created with [Sapling](https://sapling-scm.com). Best reviewed
    with [ReviewStack](https://reviewstack.dev/openai/codex/pull/18423).
    * #18698
    * __->__ #18423
  • fix: switch rate limit reset handling to timestamps (#5304)
    This change ensures that we store the absolute time instead of relative
    offsets of when the primary and secondary rate limits will reset.
    Previously these got recalculated relative to current time, which leads
    to the displayed reset times to change over time, including after doing
    a codex resume.
    
    For previously changed sessions, this will cause the reset times to not
    show due to this being a breaking change:
    <img width="524" height="55" alt="Screenshot 2025-10-17 at 5 14 18 PM"
    src="https://github.com/user-attachments/assets/53ebd43e-da25-4fef-9c47-94a529d40265"
    />
    
    Fixes https://github.com/openai/codex/issues/4761
  • fix: clean up styles & colors and define in styles.md (#2401)
    New style guide:
    
      # Headers, primary, and secondary text
      
    - **Headers:** Use `bold`. For markdown with various header levels,
    leave in the `#` signs.
      - **Primary text:** Default.
      - **Secondary text:** Use `dim`.
      
      # Foreground colors
      
    - **Default:** Most of the time, just use the default foreground color.
    `reset` can help get it back.
    - **Selection:** Use ANSI `blue`. (Ed & AE want to make this cyan too,
    but we'll do that in a followup since it's riskier in different themes.)
      - **User input tips and status indicators:** Use ANSI `cyan`.
      - **Success and additions:** Use ANSI `green`.
      - **Errors, failures and deletions:** Use ANSI `red`.
      - **Codex:** Use ANSI `magenta`.
      
      # Avoid
      
    - Avoid custom colors because there's no guarantee that they'll contrast
    well or look good on various terminal color themes.
    - Avoid ANSI `black`, `white`, `yellow` as foreground colors because the
    terminal theme will do a better job. (Use `reset` if you need to in
    order to get those.) The exception is if you need contrast rendering
    over a manually colored background.
      
      (There are some rules to try to catch this in `clippy.toml`.)
    
    # Testing
    
    Tested in a variety of light and dark color themes in Terminal, iTerm2, and Ghostty.
  • Added allow-expect-in-tests / allow-unwrap-in-tests (#2328)
    This PR:
    * Added the clippy.toml to configure allowable expect / unwrap usage in
    tests
    * Removed as many expect/allow lines as possible from tests
    * moved a bunch of allows to expects where possible
    
    Note: in integration tests, non `#[test]` helper functions are not
    covered by this so we had to leave a few lingering `expect(expect_used`
    checks around