Skip to content

test: drop private-internal and boundary-census tests with behavioral owners - #23941

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

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

Conversation

@nwparker

@nwparker nwparker commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor
Files Added Deleted Net
Test 18 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​3 $\color{#cf222e}{\Huge{\mathbf{−}}}$​787 $\color{#cf222e}{\Huge{\mathbf{−}}}$​784
Prod 11 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​7 $\color{#cf222e}{\Huge{\mathbf{−}}}$​178 $\color{#cf222e}{\Huge{\mathbf{−}}}$​171

ELI5

Fourth batch of the test-suite cleanup. Same idea as #23815, #23816 and #23829: remove tests that check how the code is written rather than what it does, and tests that re-check something another test already proves better.

What Changed

Nothing changes for users. Test-suite only.

  • Removes private-predicate cases whose behavior is already covered through the module's real entry point, and removes the export keyword from the seams those tests reached for, so the helpers are module-private again.
  • Deletes three files whose every case was a duplicate or a call-shape grep. The clearest: terminal-pane-quick-command-initialization.test.ts, six toContain greps over two sources including a verbatim call-site spelling (useTerminalQuickCommandHosts(worktreeId, contextMenu.open)); and confirmation-dialog-refresh-boundary.test.ts, which rendered a provider and asserted typeof result.current === 'function' — a probe that passes whether or not the Fast Refresh split it is named for exists.
  • Largest single removal: the describe('OpenCode hook plugin source') block in src/main/opencode/hook-service.test.ts (140 lines, 9 cases). It greped the generated plugin string for exact text (let cachedEndpointKey = "";, currentSessionID = session.parentID;, indexOf ordering, plus an sha256 "bytes stable across the module split" golden). Every contract it greped is owned by tests that actually load and drive the plugin — hook-plugin-module-contract.test.ts dynamic-imports it and feeds permission.v2.asked, hook-plugin-child-attention.test.ts drives question.asked → AskUserQuestion, and the opencode2 setup/lineage tests cover the endpoint file and child filtering.
  • Trims 5 spelling greps on installed Pi extensions (process.title, process.env.ORCA_PANE_KEY, a "return '/hook/omp'" pair) while keeping the @orca-managed-pi-extension ownership marker and the /hook/pi vs /hook/prime-agent routing assertions, which are real install contracts.

Why

A test that reaches a private helper through an export added only for it measures the helper, not the feature — and it makes the export look load-bearing to anyone reading the module.

The important result of this wave is a negative one: the source-grep vein is close to exhausted. One auditor reviewed 15 remaining flagged files and deleted nothing. What survives the earlier waves is mostly legitimate architectural ratchets that neither the type checker nor any behavioral test can reach:

  • AST fences banning as / any / @ts-* inside the RPC operation region, with per-kind exceptions and a staleness check.
  • Discovered-vs-listed set equality over subscription sites, resolving each recorded family against pilot-scenarios.json.
  • Count ceilings on unchecked reply readers and the raw sendRequest port — a compile-time fence is impossible until the migration they count finishes.
  • Assertions on the generated WebView bundle: no CDN URL, no </script tokenizer escape, and it must parse at the Chrome 74 floor. Nothing else catches an inline-script breakout or a syntax regression that only fails on an old WebView.

Those all stay. Detector counts across the tree bear the trend out: source-text greps went 111 → 25 and cross-file duplicate test bodies went 49 clusters → 6 over the merged waves.

Scope note

This wave was cut short by a session restart that killed the auditors mid-run, so it lands the verified subset rather than the full batch. 282 of the 294 flagged leaked-internal modules remain unaudited and will follow in a later PR. Everything here is independently verified (below); nothing half-edited is included.

Linked Issue

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

Visual Proof

N/A — no product code path changes. Production edits only remove an export keyword.

Testing

Verified locally on macOS:

  • pnpm run typecheck — clean, after rm -f config/tsconfig.*.tsbuildinfo (a stale build info masked a real error earlier in this audit, so this is now routine).
  • cd mobile && npx tsc --noEmit — clean. Separate project the root typecheck does not cover; it 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, 140 gates. Confirmed no gate names any deleted file.
  • 12 modified root test files: 203 passed.
  • 2 modified mobile test files: 31 passed.
  • pnpm run check:code-quality:changed — passes, 0 findings.

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

Worth a look: src/main/global-fetch-call-site-audit.test.ts was kept but is the most fragile thing in this area — a per-file line-count map over src/{main,cli,relay} where some entries count comments or git fetch identifiers, so an unrelated edit can break CI. It is kept because it is the only thing forcing a re-audit when a new global fetch( lands, and an unread undici body crashes the whole process (orca#8695). It cannot be partially trimmed: any found file missing from the map fails its drift check. The right fix is to make its regex AST-based, not to delete it — filed as a follow-up rather than done here.

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 removed. Two unwired guards found in earlier waves were reported, not deleted.
  • Cross-platform / SSH / mobile: mobile de-exports validated by mobile's own typecheck and ratchet.
  • Performance / back-compat: no runtime behavior changes.

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)

@greptile-apps

greptile-apps Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 5/5

[Low risk] Removes test cases and internal helper functions.

The PR appears safe to merge, with non-blocking test-coverage gaps in installed Pi extensions, packaging, and time boundaries.

Findings

  1. P2 Real packaging check removed ▶
  2. P2 Noon and midnight coverage removed ▶
  3. P2 Windows drive-path coverage removed ▶

Summary

The PR removes tests of private helpers and source spelling, deletes unused helper surfaces, and retains tests aimed at module behavior. The Pi extension test removal leaves one installed-file ownership contract unchecked.

Reviews (2) · Last reviewed commit: "test: drop private-internal and boundary..."

@@ -108,18 +107,4 @@ describe('copyScriptWithLocalModules', () => {
copyScriptWithLocalModules(join(sourceDir, 'entry.mjs'), destinationDir)

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 Real packaging check removed The deleted case checked that staging the actual node-pty-job-ownership.cjs script also copies windows-pe-machine.cjs, which that script requires. The remaining tests use synthetic modules, so they would not catch a change to the real gate’s dependencies that leaves the packaged Windows addon check unable to load. Please retain a package-level check for this entry script.

@@ -28,21 +26,6 @@ describe('AutomationTimeField helpers', () => {
expect(formatAutomationTimeInput(0, 0)).toBe('00:00')

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 Noon and midnight coverage removed The deleted case was the only test of the field’s midnight and noon conversions. The surviving component tests cover 13:15 and an 11:05-to-23:05 toggle, but not whether 00:05 displays as 12 AM or 12:00 remains noon when edited. A boundary regression could now pass unnoticed; please cover these cases through AutomationTimeField.

@@ -216,27 +182,9 @@ describe('isCommandOnPathForRelay', () => {
})

describe('hasAbsoluteCommandPath', () => {

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 Windows drive-path coverage removed The deleted assertion tested whether hasAbsoluteCommandPath accepts a where.exe-style Windows drive path. The remaining assertion covers only Linux output, while Windows uses a separate parsing branch. If that branch regresses, an installed agent on a Windows SSH host could be reported missing without this suite catching it. Please retain that input through the relay lookup entry point.

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

Important

The batch's stated invariant — every deleted case has a behavioral owner — fails for one file. The deleted mobile/src/tasks/mobile-task-navigation.test.ts was the only coverage for two behaviors that survive in production. Details inline.

Reviewed changes

  • Removes dead production seams — buildCommandLookupSpec, appendGitHubPRRequestedReviewers, microphoneSelectValueFromDeviceId, the automation host-picker filter/search helpers, the mobile task/host-stack wrappers, activateOpenedMobileSessionTab/refreshOpenedMobileSessionTabs, and the CLAUDE_* control catalog all have zero remaining callers after the change.
  • De-exports internal-only helpers — getAutomationClockParts, formatAutomationTimeFromClockParts, SoftSplitSection, softSplitPaletteSection, measureDictationAudioChunk, isMonacoFindHostFocused.
  • Deletes three test files — mobile-task-navigation.test.ts, confirmation-dialog-refresh-boundary.test.ts, and terminal-pane-quick-command-initialization.test.ts.
  • Trims source-grep and duplicate cases across the remaining 15 modified test files.

ℹ️ Nitpicks

  • measureDictationAudioChunk's peak upper clamp (dictation-audio-meter.ts:56) loses its only direct assertion — every remaining input through analyzeDictationAudioChunk stays within [-0.3, 1], so the clamp(peak, 0, 1) bound is never hit.
  • The generated-plugin sha256 pins in hook-service.test.ts are gone; the hook-plugin-*.test.ts suite still exercises runtime behavior, but nothing now detects an unintended change to the exact plugin bytes shipped to WSL/SSH remotes.

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

Comment on lines -186 to -203
it('unsubscribes when mounting the host throws synchronously', () => {
const harness = navigationHarness({ index: 0, routes: [{ name: 'index' }] })
const error = new Error('navigation failed')

expect(() =>
navigateToMobileTasks(
harness.navigation,
{
push: () => {
throw error
},
replace: vi.fn()
},
'host-1'
)
).toThrow(error)
expect(harness.unsubscribeState).toHaveBeenCalledOnce()
})

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.

This deletion has no behavioral owner. unsubscribes when mounting the host throws synchronously was the only test exercising navigateToHostStackRoute's catch/dispose path — mobile/src/navigation/host-stack-navigation.ts:200-206, which this PR does not change — and host-stack-navigation.test.ts has no throwing-push case. The same file's provider assertions were also the only coverage of mobileTasksRouteTarget's provider argument (mobile/src/tasks/mobile-task-navigation.ts:4-11), whose sole caller is use-open-mobile-tasks.ts:11. Consider re-homing both cases on the surviving entry points rather than dropping them.

Technical details
# Two surviving behaviors lose their only test

## Affected sites
- `mobile/src/navigation/host-stack-navigation.ts:200-206` — `try { addListener(...); router.push(...) } catch { dispose(); throw }`; the dispose-on-sync-throw guarantee is now untested. A regression here leaks the `state` listener (and its captured transition) because `dispose()` is the only thing that unsubscribes when `push` throws before the returned controller is handed back.
- `mobile/src/tasks/mobile-task-navigation.ts:4-11` — `mobileTasksRouteTarget(hostId, provider)` sets `params.taskSource`. No test passes a `provider` now.
- Deleted owners: `mobile/src/tasks/mobile-task-navigation.test.ts:186-203` (throw case) and `:60-95` / `:114-157` (provider / retarget-with-latest-provider cases).

## Required outcome
- The sync-throw dispose path is covered again, at its real entry point (`navigateToHostStackRoute`).
- `mobileTasksRouteTarget` with a `provider` is covered (it is the function the app still calls).

## Suggested approach
- Add a throwing-`push` case to `mobile/src/navigation/host-stack-navigation.test.ts`, asserting the listener is unsubscribed and the error rethrown.
- Add a `mobileTasksRouteTarget('host-1', 'linear')` assertion (e.g. next to `use-open-mobile-tasks`), or keep the equivalent case from the deleted file.

## Open questions for the human
- Was `mobile-task-navigation.test.ts` intended to be re-homed rather than deleted, given `mobileTasksRouteTarget` still ships?

Comment on lines -31 to -44
it('converts between 12h clock parts and 24h storage', () => {
expect(getAutomationClockParts('00:05')).toEqual({ hour12: 12, minute: 5, period: 'AM' })
expect(getAutomationClockParts('13:30')).toEqual({ hour12: 1, minute: 30, period: 'PM' })
expect(getAutomationClockParts('12:00')).toEqual({ hour12: 12, minute: 0, period: 'PM' })
expect(formatAutomationTimeFromClockParts({ hour12: 12, minute: 5, period: 'AM' })).toBe(
'00:05'
)
expect(formatAutomationTimeFromClockParts({ hour12: 1, minute: 30, period: 'PM' })).toBe(
'13:30'
)
expect(formatAutomationTimeFromClockParts({ hour12: 12, minute: 0, period: 'PM' })).toBe(
'12:00'
)
})

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.

The conversion helpers are still live (AutomationTimeField.tsx:181,186,194), but no remaining test covers the midnight/noon boundary this case pinned. The interaction tests use 13:15 (PM), 01:15 (AM), and 09:xx; none renders an hour of 0 or 12, so hour % 12 === 0 ? 12 and the hour < 12 ? 'AM' : 'PM' split are now unexercised. A re-homed case rendering 00:05 and 12:00 and asserting the hour field plus the AM/PM button would restore it through the component.

Technical details
# 12-hour boundary no longer exercised

## Affected sites
- `src/renderer/src/components/automations/AutomationTimeField.tsx:27` — `getAutomationClockParts`: `hour12: hour % 12 === 0 ? 12 : hour % 12`, `period: hour < 12 ? 'AM' : 'PM'`.
- `src/renderer/src/components/automations/AutomationTimeField.tsx:36` — `formatAutomationTimeFromClockParts` inverse.
- Deleted owner: `AutomationTimeField.test.tsx:31-44` (old lines).

## Required outcome
- Midnight (`00:05` → 12:05 AM) and noon (`12:00` → 12:00 PM) round-trip through the rendered field.

## Suggested approach
- Extend the `AutomationTimeField interactions` describe with a render at `00:05` and one at `12:00`, asserting `Hour` value and the AM/PM button label, then a commit round-trip.

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

Important

Review skipped

Review was skipped as selected files did not have any reviewable changes.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Advanced

Run ID: c0e9a4ee-75f4-4292-83c4-20b0b35cae98

📥 Commits

Reviewing files that changed from the base of the PR and between f60e7b4dc73032f91be0de4df2d7e2170eaac3d4 and a83f92a.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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: 5df06e42-f5f3-4145-bd68-88259ab926a8

📥 Commits

Reviewing files that changed from the base of the PR and between 70475e0 and f60e7b4dc73032f91be0de4df2d7e2170eaac3d4.

📒 Files selected for processing (29)
  • config/scripts/script-module-dependencies.test.mjs
  • mobile/src/reanimated-web-mapper-deps.test.ts
  • mobile/src/session/opened-mobile-session-tab.test.ts
  • mobile/src/session/opened-mobile-session-tab.ts
  • mobile/src/tasks/mobile-task-navigation.test.ts
  • mobile/src/tasks/mobile-task-navigation.ts
  • src/main/claude/claude-structured-inbound-control.test.ts
  • src/main/claude/claude-structured-inbound-control.ts
  • src/main/opencode/hook-service.test.ts
  • src/main/pi/titlebar-extension-service.test.ts
  • src/main/terminal-history.test.ts
  • src/relay/preflight-handler.test.ts
  • src/relay/preflight-handler.ts
  • src/renderer/src/components/automations/AutomationTimeField.test.tsx
  • src/renderer/src/components/automations/AutomationTimeField.tsx
  • src/renderer/src/components/automations/automation-host-picker-groups.test.ts
  • src/renderer/src/components/automations/automation-host-picker-groups.ts
  • src/renderer/src/components/cmd-j/palette-section-render-cap.test.ts
  • src/renderer/src/components/cmd-j/palette-section-render-cap.ts
  • src/renderer/src/components/confirmation-dialog-refresh-boundary.test.ts
  • src/renderer/src/components/dictation/dictation-audio-meter.test.ts
  • src/renderer/src/components/dictation/dictation-audio-meter.ts
  • src/renderer/src/components/dictation/microphone-devices.test.ts
  • src/renderer/src/components/dictation/microphone-devices.ts
  • src/renderer/src/components/editor/monaco-find-widget.test.ts
  • src/renderer/src/components/editor/monaco-find-widget.ts
  • src/renderer/src/components/github-pr-reviewer-display.test.ts
  • src/renderer/src/components/github-pr-reviewer-display.ts
  • src/renderer/src/components/terminal-pane/terminal-pane-quick-command-initialization.test.ts
💤 Files with no reviewable changes (21)
  • src/renderer/src/components/confirmation-dialog-refresh-boundary.test.ts
  • mobile/src/tasks/mobile-task-navigation.test.ts
  • src/main/pi/titlebar-extension-service.test.ts
  • src/renderer/src/components/github-pr-reviewer-display.ts
  • src/renderer/src/components/github-pr-reviewer-display.test.ts
  • src/renderer/src/components/dictation/microphone-devices.test.ts
  • src/main/claude/claude-structured-inbound-control.ts
  • src/renderer/src/components/dictation/microphone-devices.ts
  • src/relay/preflight-handler.ts
  • mobile/src/session/opened-mobile-session-tab.ts
  • config/scripts/script-module-dependencies.test.mjs
  • mobile/src/reanimated-web-mapper-deps.test.ts
  • src/renderer/src/components/terminal-pane/terminal-pane-quick-command-initialization.test.ts
  • src/renderer/src/components/editor/monaco-find-widget.test.ts
  • src/relay/preflight-handler.test.ts
  • src/renderer/src/components/dictation/dictation-audio-meter.test.ts
  • mobile/src/session/opened-mobile-session-tab.test.ts
  • src/renderer/src/components/automations/AutomationTimeField.test.tsx
  • src/renderer/src/components/automations/automation-host-picker-groups.ts
  • src/main/terminal-history.test.ts
  • src/renderer/src/components/cmd-j/palette-section-render-cap.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 exported helpers, types, and functions, and removes associated tests across configuration, mobile, main-process, and renderer code. Some implementations remain but are no longer exported. Other changes remove individual test cases or entire test suites.

Priority: ⬇️ Low

Merge Risk: ⚪ Minimal · up to f60e7

The change removes internal exports and redundant tests without an established runtime regression. No actionable merge-blocking issue remains in the supplied evidence; merge after normal CI checks pass.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 10 functions across 8 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
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.
Title check ✅ Passed The title clearly describes the primary change: removing private-internal and boundary-census tests that have behavioral coverage.
Description check ✅ Passed The description is complete and matches the repository template. It explains the purpose, scope, rationale, linked-issue exception, testing, review notes, compatibility considerations, and checklist s…
✨ 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.

… owners

Fourth audit wave, cut short by a session restart, so this lands the verified
subset rather than the full batch.

Removes private-predicate cases whose behavior is already covered through the
module's real entry point, and de-exports the seams they reached for. Also drops
three whole files whose every case was a duplicate or a call-shape grep.

The source-grep vein is close to exhausted. One auditor reviewed 15 remaining
flagged files and deleted nothing: what is left is mostly legitimate
architectural ratchets that no type checker and no behavioral test can reach —
AST fences banning `as`/`any` in an RPC operation region, discovered-vs-listed
set equality over subscription sites, count ceilings on unchecked reply readers,
and assertions on generated WebView bundles (no CDN URL, no `</script`
tokenizer escape, parses at the Chrome 74 floor). Those stay.
@nwparker
nwparker force-pushed the nwparker/test-audit-wave4 branch from f60e7b4 to a83f92a Compare September 29, 2026 23:17
@greptile-apps

greptile-apps Bot commented Sep 29, 2026

Copy link
Copy Markdown

Comments Outside Diff

These findings could not be posted inline.

  • P2 Installed extension markers go unchecked src/main/pi/titlebar-extension-service.test.ts:218 ▶

    The test no longer checks that the installed titlebar and prefill extensions contain @orca-managed-pi-extension. The installer uses that marker to decide whether it may overwrite a file on a later launch. If either installed file loses the marker, this suite would pass while that extension could no longer be updated automatically.

@nwparker
nwparker merged commit 6194a7a into main Sep 29, 2026
54 checks passed
nwparker added a commit that referenced this pull request Sep 29, 2026
Fifth audit wave, renderer-scoped. Same shape as #23941: delete private-predicate
cases whose behavior is already asserted through the module's real entry point,
then make the symbol module-private again.

Two whole files went as provider-local replays: `terminal-paste-payload-metadata`
(same corpus, same inputs, same expectations as `lib/paste-payload-metadata`, just
renamed symbols) and `repro-8784-ghe-avatar-fallback` (every case now asserted
through the rendered component in `github-user-avatar.test.tsx`).

Dead production code removed where tests were its only callers:
`resolveImeModifierGesture`, `isCodexTerminalStartupCommand` (its codex branches
are covered by `isKnownTuiAgentTerminalStartupCommand`), `reconcileSelectionKeys`
(superseded by `reconcileSourceControlSelectionState`, which the hook calls), and
`chatFontScaleShortcutLabels` (nothing renders those labels).

Roughly three quarters of the flagged modules were detector false positives and
were left untouched; the scanner cannot see re-export barrels, `.web.ts` platform
variants, build-time overrides, or `*ForTests` inspection seams.

`accumulateWorkItemPages` is deliberately NOT deleted despite having only test
callers. It, the dead `filesystem-directory-listing-limit` module, and
`resolveImeModifierGesture` all landed unwired in the same refactor (#16177), and
unwired page accumulation is more likely a lost wiring step than dead weight.
Deleting it would erase that evidence.
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