Skip to content

test: stop testing private internals through exports no caller needs - #23829

Merged
nwparker merged 1 commit into
mainfrom
nwparker/test-audit-wave3
Sep 29, 2026
Merged

nwparker merged 1 commit into
mainfrom
nwparker/test-audit-wave3

Conversation

@nwparker

@nwparker nwparker commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor
Files Added Deleted Net
Test 36 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​22 $\color{#cf222e}{\Huge{\mathbf{−}}}$​813 $\color{#cf222e}{\Huge{\mathbf{−}}}$​791
Prod 20 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​18 $\color{#cf222e}{\Huge{\mathbf{−}}}$​455 $\color{#cf222e}{\Huge{\mathbf{−}}}$​437

ELI5

Stacked on #23816. Some tests can only run because the production file was changed to expose an inner helper the real app never uses. That's backwards: the test drives a private detail through a door added just for it, so it passes while the behavior users actually get goes unchecked. This removes those tests where the same behavior is already checked through the real entry point, and closes the door again.

What Changed

Nothing changes for users. 1 test file deleted, ~30 trimmed, and several genuinely dead production modules/symbols removed.

The detector looked for production modules exporting 3+ symbols that no production file imports — only tests do. That shape is the authoring gate's fourth question failing: does the test need a production seam no production caller needs? If yes, it belongs at the real boundary.

For each module, per symbol:

  • Behavior already covered through the module's real entry point -> the duplicate cases are deleted and the export keyword removed, so the symbol is module-private again.
  • Behavior covered nowhere else -> the test stays. This audit removes tests; it does not author replacements. Those are listed as follow-ups below rather than deleted.

Production code removed (tests were its only callers):

  • src/shared/filesystem-directory-listing-limit.ts — whole module. See the note below; this one has a story.
  • format{Hourly,Daily,Adhoc}Version in src/shared/release-channel.ts, plus three now-orphaned *_PRERELEASE_IDENTIFIER constants. Zero callers repo-wide.
  • The filterByAutomationListSearch* / automationListSearchFieldsMatch family — superseded dead code; the live filter is matchAutomationListSearchRowKeys, already owned by automation-list-search-rows.test.ts.
  • getAiVaultResumeWorktreeTargetStatus and two boolean wrappers — a dead parallel copy of the worktree branch inside the live getAiVaultResumeWorkspaceTargetStatus.
  • CODEX_BLOCKING_SERVER_REQUEST_METHODS — an array compared against a copied literal of the same constants; the array itself was dead.

Also removes two call-shape source greps in cloud/apps/relay/src/relay-sweep-schedule.test.ts that asserted index.ts spells jitteredSweepIntervalMs(30_000) (one anchored on a log-message string). The jitter math has a behavioral owner at the top of that same file. The structural census beside them stays — it counts role-gated vs total setInterval( calls, survives renames, and guards a fleet-wide cost invariant: an ungated sweep runs in every cell, multiplying one table scan by the fleet size, and nothing else can catch that because index.ts boots a server on import.

Why

A test that reaches a private helper through an export added for it measures the helper, not the feature. The clamping example from this wave: mobile-native-chat-message-text.test.ts drove clampFontScale directly, while use-mobile-native-chat-pinch-gesture.test.ts already asserts quantizeFontScale(5) === 1.8, quantizeFontScale(0.1) === 0.8, and quantizeFontScale(NaN) === 1 through the function production actually imports. Same three contracts, one boundary stronger. The private test went; the bounds are still checked.

The detector was mostly wrong, and that's the important caveat. On the first batch, 19 of 26 flagged modules were false positives — the import scanner misses re-export barrels, dynamic imports, and string-keyed access. So every module was re-verified with rg before any edit, and false positives were left completely untouched. I'm reporting the precision because it bounds how much to trust the detector, not the review.

Alternatives considered: rewriting each private test at the real boundary would be better than deleting, but it means authoring tests, which needs its own authoring-gate justification per test and does not belong in a removal PR. Hence the split: delete only where coverage already exists at the stronger boundary, and file the rest as follow-ups.

Two findings I deliberately did NOT act on

1. Two directory-listing guards are dead, and mobile listing looks unbounded. src/shared/mobile-file-directory-limit.ts exports a complete guard (MAX_ENTRIES = 10_000, MAX_RETAINED_BYTES = 4 MiB, trackMobileFileDirectoryEntry, assertMobileFileDirectoryWithinLimit) and its only importer is its own test — nothing in src/ or mobile/ wires it. filesystem-directory-listing-limit.ts was a near-identical duplicate (100_000 / 12 MiB) added by refactor #16177 and likewise never wired; that one is deleted here, because deleting a duplicate of an already-dead module changes no behavior.

I left mobile-file-directory-limit.ts in place even though it matches the "dead production code whose only callers are tests" pattern. It is the more plausible intended guard, and deleting it would erase the evidence that the bound is missing. Someone who owns mobile file listing should decide: wire it, or confirm another layer bounds the listing. Compare workspace-space-scan-budget.ts and markdown-document-listing-limits.ts, which are wired.

2. Needs a boundary rewrite (follow-up, not done here). src/renderer/src/components/settings/AdvancedNetworkSettingsSection.tsx exports 7 helpers used only by its test; production imports just the component. The real behavior — an async settings reload must not clobber in-flight proxy edits — is covered nowhere else, and there is no component-level test. The right fix is to render the section and drive the inputs, then de-export. The test is kept as-is until someone does that.

Linked Issue

N/A — test-suite hygiene, no pre-existing issue.

Visual Proof

N/A — no product code path changes. Production edits either remove an export keyword or delete code with no non-test callers.

Testing

Verified locally on macOS:

  • pnpm run typecheck — clean, run after rm -f config/tsconfig.*.tsbuildinfo (a stale build info masked a real error earlier in this audit).
  • cd mobile && tsc --noEmit — clean. This is a separate project the root typecheck does not cover, and it is the check that validates the mobile de-exports.
  • mobile/scripts/check-tests-typecheck-ratchet.mjs — OK, 882 test files, 125 grandfathered.
  • node config/scripts/check-reliability-gates.mjs — passes for 140 gates.
  • pnpm run check:code-quality:changed — passes, 0 findings across 57 changed files.
  • 29 modified root test files: 390 passed, 7 skipped.
  • 4 modified mobile test files: 33 passed.
  • cloud/apps/relay/src/relay-sweep-schedule.test.ts: 4 passed.
  • Every deleted production symbol re-checked with a repo-wide rg for residual references, including non-TypeScript callers: 0 hits for all 11.

Not run locally: e2e and the Windows/Linux/SSH jobs — left to CI.

  • I manually tested these changes locally
  • Automated tests added/updated, or explained why not below

Removal-only; no new tests.

Review

Please push back on:

  1. Any production deletion you think was premature. Typecheck plus a repo-wide grep is strong evidence but not proof against reflective or string-keyed access. The five symbol groups are listed above by name for exactly this reason.
  2. The mobile-file-directory-limit call. I chose to flag rather than delete. If you'd rather it go, it's a one-line removal — but the missing bound is the real question.
  3. relay-sweep-schedule.test.ts — I kept the setInterval census and dropped the two call-shape greps. If you think the census is equally brittle, say so.

Agent skill upstream boundary

  • Not applicable, or this change follows docs/reference/agent-skill-sharing-upstream-boundary.md and copies or mechanically translates no upstream skill-installer source, tests, fixtures, registry entries, path tables, comments, or documentation.

Notes

  • Security: no guard was removed from a live path. The one deleted guard module was already unreachable, and the finding above escalates the unwired one rather than hiding it.
  • Cross-platform / SSH / mobile: the mobile de-exports are validated by mobile's own typecheck and ratchet; the relay change is test-only except for the two deleted greps.
  • Performance / back-compat: no runtime behavior changes. Less dead code to load and typecheck.

Checklist

  • This PR is small and focused
  • I explained what changed and why (ELI5, the user-facing before/after, the mechanism, and why over the alternatives)
  • Before/after screenshots or videos attached for UI changes, or N/A with reason
  • Self-reviewed for correctness, security, and performance
  • Cross-platform, SSH/remote, and path/shortcut impact considered (or N/A)
  • pnpm lint, pnpm typecheck, pnpm test, and pnpm build pass (or CI will cover; local preferred)

@nwparker
nwparker requested a review from Jinwoo-H as a code owner September 29, 2026 08:33
@greptile-apps

greptile-apps Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 2/5

[Low risk] Removes test-only exports of internal helper functions.

The PR does not appear safe to merge while Stop can miss or be overtaken by in-flight messages.

Findings

  1. P2 Cleanup timer wiring goes unchecked ▶
  2. P2 Worktree host precedence loses coverage ▶
  3. P2 Failed eligibility requests go untested ▶

Summary

The PR removes tests and exports used only by tests, and subsequent changes add a capability-gated conversation Stop before a provider turn opens, with outbox withdrawal and draft restoration.

  • The new Stop path can leave an in-flight send able to run after Stop.
  • Both provider adapters can miss a Stop when a write is ambiguous and no turn ID is available.
  • The three earlier test-coverage findings remain outstanding.

Reviews (2) · Last reviewed commit: "test: stop testing private internals thr..."

expect(cleanup?.[1]).toBe('jitteredSweepIntervalMs(30_000)')
})

// A census, not a list of the timers that happen to be gated today: an ungated sweep runs in

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 Cleanup timer wiring goes unchecked

The two removed assertions were the only checks that the assignment and credential cleanup timers use jitter. The remaining tests check the jitter calculation and maintenance-role gating, but would still pass if either timer changed to a fixed 30-second interval. Please retain a check of those timers’ wiring so that loss of load spreading is caught.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

@@ -98,68 +71,6 @@ describe('mobile AI Vault resume target guards', () => {
{ id: 'group-runtime', executionHostId: 'runtime:devbox' as const }

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 Worktree host precedence loses coverage

The removed case checked that a worktree’s explicit SSH host takes precedence over its local repo’s host. None of the remaining resolver tests supplies a worktree with an explicit hostId, so a change that incorrectly allows resume in that SSH workspace would go unnoticed. Please cover this case through resolveMobileAiVaultSessionResumeTarget.

@@ -101,38 +100,6 @@ describe('mobile hosted review eligibility loader core', () => {
expect(local.identity).not.toBe(ssh.identity)

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 Failed eligibility requests go untested

Removing the error-state assertion leaves no test that checks what the hook returns when an eligibility request fails. The remaining request tests cover successful responses; the error-state test elsewhere starts with an error state rather than producing one. Please test a null or rejected response through the hook and assert it returns { kind: 'error' }, so a failed refresh cannot silently leave Create PR eligible.

@pullfrog pullfrog Bot 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.

ℹ️ No critical issues — one documentation gap worth a look.

Reviewed changes

  • Test deletions/trims — ~36 test files trimmed (813 lines removed); dropped tests that pinned constants, asserted cross-function consistency, greps of source text, or drove private helpers directly, keeping the behavior tests that run through real entry points.
  • De-exports — ~15 symbols returned to module-private (agent-history-resume-target, mobile-native-chat-message-text, the renderer lib/ helpers, linear-scope-selector, task-page-default-repo-selection, etc.).
  • Test import rewrites — useEditorExternalWatch*.test.ts and friends now import buildEditorExternalWatchEventHandler from editor-external-watch-event-reconciliation and selectEditorExternalWatchTargets from editor-external-watch-targets, letting the compatibility delegates go.
  • Dead production code removed — filesystem-directory-listing-limit.ts, format{Hourly,Daily,Adhoc}Version + prerelease constants, the filterByAutomationListSearch* family, getAiVaultResumeWorktreeTargetStatus + wrappers, CODEX_BLOCKING_SERVER_REQUEST_METHODS, and more.

I independently re-ran the caller check (grep for every fully-deleted symbol: zero residual callers; the lone ci-shard-timings.json hit is inert, since that map only looks up discovered files), tsc for both the node and web projects, and targeted root tests for the rewritten imports — all clean. The deletions and de-exports look correct.

ℹ️ The description's removal inventory undercounts what the diff actually deletes

The "Production code removed" list names five symbol groups and the Testing section claims "0 hits for all 11," but the diff fully deletes roughly twice that many production symbols. Since the PR explicitly asks reviewers to push back on premature production deletions by name, the list should cover the whole set — otherwise a reviewer can sign off on the five groups and never look at the rest.

Technical details
# Unlisted production deletions

The five called-out groups are `filesystem-directory-listing-limit.ts`,
`format{Hourly,Daily,Adhoc}Version` (+3 constants), the
`filterByAutomationListSearch*` family, `getAiVaultResumeWorktreeTargetStatus` (+2
wrappers), and `CODEX_BLOCKING_SERVER_REQUEST_METHODS`. The diff additionally
removes (all verified to have zero remaining callers):

## Affected sites
- `src/shared/markdown-document-listing-limits.ts` — `isMarkdownDocumentListingCapacityError`, and the `MARKDOWN_DOCUMENT_LISTING_ERROR_MESSAGE` export
- `src/shared/quick-open-listing-limits.ts` — `createQuickOpenListingBudget`, `retainQuickOpenPath`, `QuickOpenListingBudget`, `QUICK_OPEN_LISTING_MAX_RETAINED_PATHS`, `QUICK_OPEN_LISTING_MAX_RETAINED_PATH_BYTES`
- `src/renderer/src/lib/new-workspace-project-options.ts` — `searchNewWorkspaceProjectOptions`, `buildNewWorkspaceFolderSourceOptions`, `getRepoIdFromNewWorkspaceFolderSourceOptionId`, `NEW_WORKSPACE_FOLDER_SOURCE_OPTION_PREFIX`, `NewWorkspaceProjectOptionBase`
- `src/main/ssh/ssh-remote-commands.ts` — `promoteRemoteTreeContentsCommand`, `commandInRemoteDirectory`
- `src/shared/grok-session-paths.ts` — `isGrokChatHistoryPath`
- `src/renderer/src/components/task-page-default-repo-selection.ts` — `getTaskProjectPickerRepos`
- `src/renderer/src/lib/worktree-palette-create-action.ts` — `WORKTREE_PALETTE_SELECTION_MOVE_KEYS`
- `src/renderer/src/lib/app-menu-paste.ts` — `shouldOwnAppMenuTextControlPaste`
- `src/renderer/src/lib/launch-structured-agent-session.ts` — `isDefinitiveStructuredAgentSessionCreateError`

## Required outcome
- The "Production code removed" list and the "all 11" count reflect the full set of
  deleted production symbols/modules, so a reviewer can scope their check correctly.

## Open questions for the human
- Is `isMarkdownDocumentListingCapacityError` intentionally dropped rather than kept as
  evidence that IPC/remote markdown capacity errors (Electron-wrapped) still need a
  classifier, the way `mobile-file-directory-limit.ts` was kept? It is dead today, so
  the code change is fine either way — this is only about whether the description's
  "five groups" framing is complete.

Pullfrog  | Fix it ➔ | View workflow run | Using DeepSeek Flash (free via Pullfrog for OSS) | 𝕏

@nwparker
nwparker changed the base branch from nwparker/test-audit-wave2 to main September 29, 2026 09:22
Third audit wave. The detector looked for production modules exporting three
or more symbols that no production file imports — only tests do. That shape is
the authoring gate's fourth question failing: a test needing a production seam
no caller needs belongs at the real boundary instead.

Most hits were detector false positives and were left alone; the scanner misses
re-export barrels and dynamic imports, so every module was re-verified with rg
before any edit. Where a private predicate's behavior was already covered
through the module's real entry point, the duplicate cases are gone and the
symbol is module-private again. Where it was NOT covered anywhere else, the test
stays — this audit removes tests, it does not author replacements.

Production code deleted where tests were its only callers: the superseded
`filesystem-directory-listing-limit` module, the unused
`format{Hourly,Daily,Adhoc}Version` helpers and their orphaned prerelease
identifiers, the dead `filterByAutomationListSearch*` family superseded by
`matchAutomationListSearchRowKeys`, and the dead
`getAiVaultResumeWorktreeTargetStatus` copy of the live workspace branch.

Also drops two call-shape source greps in `relay-sweep-schedule.test.ts` that
asserted `index.ts` spells `jitteredSweepIntervalMs(30_000)`; the jitter math
has a behavioral owner at the top of the same file. The structural census that
counts role-gated vs total `setInterval(` calls stays — an ungated sweep runs in
every cell, and nothing else can catch that.
@nwparker
nwparker force-pushed the nwparker/test-audit-wave3 branch from 6104877 to e48e922 Compare September 29, 2026 09:22
@coderabbitai

coderabbitai Bot commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Advanced

Run ID: 73c115e5-7133-4e9d-a241-27958f25643c

📥 Commits

Reviewing files that changed from the base of the PR and between 31012ae and e48e922.

📒 Files selected for processing (56)
  • cloud/apps/relay/src/relay-sweep-schedule.test.ts
  • mobile/src/agent-history/agent-history-resume-target.test.ts
  • mobile/src/agent-history/agent-history-resume-target.ts
  • mobile/src/mobile-web-shell/bridge/page-bootstrap.test.ts
  • mobile/src/session/mobile-native-chat-answer-stepping.test.ts
  • mobile/src/session/mobile-native-chat-message-text.test.ts
  • mobile/src/session/mobile-native-chat-message-text.ts
  • mobile/src/source-control/use-mobile-hosted-review-eligibility.test.ts
  • mobile/src/source-control/use-mobile-hosted-review-eligibility.ts
  • src/main/codex/codex-server-request-disposition.test.ts
  • src/main/codex/codex-server-request-disposition.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-host-teardown.test.ts
  • src/main/runtime/browser-tab-create-publication.test.ts
  • src/main/ssh/ssh-remote-commands.test.ts
  • src/main/ssh/ssh-remote-commands.ts
  • src/relay/pty-handler-attach-replay.test.ts
  • src/renderer/src/components/automations/automation-list-search.test.ts
  • src/renderer/src/components/automations/automation-list-search.ts
  • src/renderer/src/components/linear-scope-selector.test.ts
  • src/renderer/src/components/linear-scope-selector.tsx
  • src/renderer/src/components/task-page-default-repo-selection.test.ts
  • src/renderer/src/components/task-page-default-repo-selection.ts
  • src/renderer/src/hooks/useEditorExternalWatch-complexity.test.ts
  • src/renderer/src/hooks/useEditorExternalWatch-self-move.test.ts
  • src/renderer/src/hooks/useEditorExternalWatch-targets.test.ts
  • src/renderer/src/hooks/useEditorExternalWatch-wsl-repro.test.ts
  • src/renderer/src/hooks/useEditorExternalWatch.test.ts
  • src/renderer/src/hooks/useEditorExternalWatch.ts
  • src/renderer/src/lib/agent-picker-search.test.ts
  • src/renderer/src/lib/agent-picker-search.ts
  • src/renderer/src/lib/ai-vault-resume-target.test.ts
  • src/renderer/src/lib/ai-vault-resume-target.ts
  • src/renderer/src/lib/app-menu-paste.test.ts
  • src/renderer/src/lib/app-menu-paste.ts
  • src/renderer/src/lib/execute-open-editor-path-move.test.ts
  • src/renderer/src/lib/http-link-modifier-routing.test.ts
  • src/renderer/src/lib/launch-structured-agent-session.test.ts
  • src/renderer/src/lib/launch-structured-agent-session.ts
  • src/renderer/src/lib/markdown-review-notes.test.ts
  • src/renderer/src/lib/new-workspace-project-options.test.ts
  • src/renderer/src/lib/new-workspace-project-options.ts
  • src/renderer/src/lib/plugin-command-keybindings.test.ts
  • src/renderer/src/lib/terminal-input-activity-coalescing.test.ts
  • src/renderer/src/lib/worktree-palette-create-action.test.ts
  • src/renderer/src/lib/worktree-palette-create-action.ts
  • src/renderer/src/store/slices/restored-editor-owner-reparent.test.ts
  • src/shared/filesystem-directory-listing-limit.test.ts
  • src/shared/filesystem-directory-listing-limit.ts
  • src/shared/grok-session-paths.test.ts
  • src/shared/grok-session-paths.ts
  • src/shared/markdown-document-listing-limits.test.ts
  • src/shared/markdown-document-listing-limits.ts
  • src/shared/quick-open-listing-limits.test.ts
  • src/shared/quick-open-listing-limits.ts
  • src/shared/release-channel.test.ts
  • src/shared/release-channel.ts
💤 Files with no reviewable changes (34)
  • src/renderer/src/lib/http-link-modifier-routing.test.ts
  • mobile/src/session/mobile-native-chat-message-text.test.ts
  • src/renderer/src/lib/terminal-input-activity-coalescing.test.ts
  • src/relay/pty-handler-attach-replay.test.ts
  • src/renderer/src/lib/worktree-palette-create-action.test.ts
  • src/renderer/src/components/task-page-default-repo-selection.ts
  • src/renderer/src/lib/markdown-review-notes.test.ts
  • src/renderer/src/lib/launch-structured-agent-session.ts
  • src/renderer/src/lib/worktree-palette-create-action.ts
  • src/renderer/src/components/linear-scope-selector.test.ts
  • src/main/codex/codex-server-request-disposition.test.ts
  • mobile/src/source-control/use-mobile-hosted-review-eligibility.test.ts
  • src/main/ssh/ssh-remote-commands.ts
  • src/renderer/src/lib/agent-picker-search.test.ts
  • src/shared/quick-open-listing-limits.test.ts
  • cloud/apps/relay/src/relay-sweep-schedule.test.ts
  • mobile/src/mobile-web-shell/bridge/page-bootstrap.test.ts
  • src/renderer/src/lib/plugin-command-keybindings.test.ts
  • mobile/src/session/mobile-native-chat-answer-stepping.test.ts
  • src/renderer/src/lib/ai-vault-resume-target.test.ts
  • src/renderer/src/components/task-page-default-repo-selection.test.ts
  • src/shared/filesystem-directory-listing-limit.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-host-teardown.test.ts
  • src/shared/markdown-document-listing-limits.test.ts
  • src/renderer/src/lib/launch-structured-agent-session.test.ts
  • src/shared/filesystem-directory-listing-limit.test.ts
  • src/shared/release-channel.ts
  • src/renderer/src/components/automations/automation-list-search.ts
  • src/renderer/src/components/automations/automation-list-search.test.ts
  • src/shared/grok-session-paths.test.ts
  • src/main/codex/codex-server-request-disposition.ts
  • src/renderer/src/lib/new-workspace-project-options.ts
  • src/renderer/src/lib/ai-vault-resume-target.ts
  • src/main/ssh/ssh-remote-commands.test.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 8 remain after this review.


📝 Walkthrough

Walkthrough

The pull request removes selected tests and helper APIs across mobile, main-process, renderer, and shared code. It also changes several helper exports to module-local declarations and updates editor-watch tests to import helpers from dedicated modules. Some retained tests now use literal release-version strings or check indexed-field limits.

Priority: ⬇️ Low

Merge Risk: ⚪ Minimal · up to e48e9

The editor-watch test import is valid, and no concrete issue remains that should delay merging after normal checks.

Security Architecture Review

Security architecture risk: 🔵 Low · up to e48e9

The inspected production paths retain their path-size and result limits, and no new security exposure was identified. The full consumer surface has not been established.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — For the inspected quick-open production path, removal of the unused budget API does not increase the effective subprocess-output-to-IPC listing exposure.

Trust Boundaries and Controls

  • observed — The inspected entrypoints retain their relevant controls: Grok encoded-directory validation and quick-open per-path bounding and result limiting.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 4.76% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 21 functions across 22 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the main change: removing tests that access private internals through unnecessary exports.
Description check ✅ Passed The description is detailed and follows the required structure. It explains the change, rationale, scope, testing, visual impact, risks, and checklist status. The linked issue is marked N/A, which is …
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@nwparker
nwparker merged commit 70475e0 into main Sep 29, 2026
55 checks passed
brennanb2025 added a commit that referenced this pull request Sep 29, 2026
…3789, #23812, #23852) into brennanb2025/codex-home-single-writer

#23744 moves every agent's folder pre-trust into the PTY spawn hook (and
the structured Codex chat create), removing Codex's launch-prep and
resume-prep trust writes. markCodexProjectTrusted now takes the config
files to write.

Conflicts:
- agent-trust-presets.ts: #23744's configFiles signature and nested lane
  acquisition, with this branch's lane rationale (hook installs read and
  rewrite across awaits); main's "capture->restore window" wording
  described the grant snapshot this branch removed.
- agent-trust-write-deadline.ts: the Codex writer waits only on
  managed-home installs' inline grant; the real-home background approval
  holds no lane. #23744's SSH/SFTP writer is gone, so it is no longer
  named; its 1.5 s short deadline is kept.
- codex-trust-config-concurrent-launch.test.ts: this branch's tests
  (a launch's write lands while a grant session runs; the renamed
  sibling-failure case) with #23744's new call signature.

Outside the conflicts: codex-launch-during-real-home-grant.test.ts passed
launchAgent/workspacePath into launch prep, which #23744 removed; its
launch helper now runs launch prep and then applyAgentWorkspaceTrust, as
the spawn builder does, so it still proves a launch and its project trust
land while the real-home approval hangs.
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.

1 participant