Commit 1943d88
authored
* build(typescript): enable noUnusedLocals/noUnusedParameters repo-wide (#9553)
Dead code is the substrate every drift bug in the 2026-07-27 audit grew on: a stale
import or an orphaned constant reads exactly like a live wire, so the next person
greps, finds it, and reasons about a code path that no longer runs.
Enabling the flags made the compiler enumerate all 515 instances. Every one in
src/** and packages/** was traced to its replacement before deletion -- all 82 were
genuine supersession leftovers, no behaviour bug hiding among them -- but the triage
turned up three real problems that were invisible under the noise:
1. src/queue/processors.ts -- sweepRepoBacklogConvergence accepted `requestedBy`
("schedule" | "api" | "test") and dropped it. Every sibling sweep stamps it into
recordAuditEvent's metadata; both agent.sweep.backlog_convergence events here
omitted it, so those records could not be attributed to a schedule vs a manual API
trigger. Now wired into both. (Note the mechanical fix would have been to rename it
`_requestedBy`, which cements the gap instead of closing it.)
2. test/unit/openapi.test.ts -- the #9302 REST<->MCP parity guard asserted against
src/mcp/server.ts's gatePrecisionOutputSchema and maintainerMeasurementReportOutputSchema,
which the tools stopped registering when #9518 moved their outputs to
@loopover/contract. The shapes are still identical, so nothing had drifted YET --
but the guard was watching objects no runtime reads and would not have caught a
future contract change. Re-anchored onto GetGatePrecisionOutput.shape /
GetOutcomeCalibrationOutput.shape, which is what the tools actually register, and
what that file's own header comment already claimed it did.
3. src/github/resolve-command.ts was reachable only from its own test, because
src/review/review-memory-wire.ts carried a SECOND byte-identical copy of
normalizeResolveFindingRef (regex included) and that copy was the one production
used. Two independent implementations of the same public-safety validation, free to
drift. Deduped onto the original via re-export; dead-source-files:check now passes
on a file it was about to start failing on.
Also corrects packages/loopover-engine/src/scoring/preview.ts's header, which claimed
a ReDoS guarantee via a hasUnsafeWildcardCount import that had been dead since
625e236 deduped its label matching onto label-match.ts. The guarantee is real and
unchanged; it now arrives through labelMatchesPattern, and the comment says so.
Pre-existing import-specifier violations fixed in the same pass, since the tree has to
be green for the flags to mean anything:
- scripts/actionlint.ts imported a `.ts` specifier (TS5097)
- test/unit/contract-registry.test.ts had three `.js` specifiers in a Bundler zone
- check-dead-source-files-script.test.ts tripped check-import-specifiers on its own
string FIXTURES, the same self-referential false positive that checker's
ALLOWED_FILENAMES already documents for its own test
Mechanics: unused parameters are renamed with a leading underscore, never deleted --
they are positional, so removing one silently re-binds every later argument. Everything
else was removed by its real TypeScript AST node span (a regex pass was tried first and
mis-bounded declarations badly enough to produce unparseable files).
Full suite green: 23,894 passed, 0 failed. tsc clean with the flags on.
* chore(engine): bump to 3.15.4 for the dead type-import removal in gate-advisory.ts
check-engine-parity holds the two hand-duplicated gate-decision twins
(packages/loopover-engine/src/advisory/gate-advisory.ts and src/rules/advisory.ts)
in lockstep: touching one without the other requires an engine version bump. That is
the mechanism, and it is doing its job here.
the engine twin. They are genuinely dead there and NOT in the host: the engine copy is
a deliberately slimmed re-implementation (#4881) that omits buildIssueAdvisory /
addIssueFindings / collisionClustersForPull, which are what use those types on the host
side. So there is no matching host edit to make -- the asymmetry is correct, and the
version bump is the sanctioned way to record it.
No behaviour change: type-only imports are erased at compile time. The bump exists so
the parity contract stays enforceable, not because the gate decides anything
differently. packages/loopover-miner/expected-engine.version moves in lockstep, as its
own check requires.
* fix(scripts,mcp): restore actionlint's `.ts` specifier and drop a dead shape #9565 added
Two rebase follow-ups after #9565 and #9574 landed.
1. scripts/actionlint.ts gets its `.ts` extension back. This PR had removed it to satisfy
check-import-specifiers, which broke the script outright -- it runs under
`node --experimental-strip-types`, whose ESM resolver does no extension resolution, so
the process dies at startup with ERR_MODULE_NOT_FOUND. #9565 independently reached the
same conclusion and added TYPE_STRIPPED_ENTRYPOINTS to the checker for exactly this
file, so the extension is now permitted where it is required. Verified by running
`npm run actionlint`, which fails before this change and passes after.
#9565's version of the checker is taken wholesale over this PR's: it solves the same
two problems (that entrypoint set, plus allowlisting check-dead-source-files-script.test.ts
for its string fixtures), and re-litigating a file main just rewrote buys nothing.
2. src/mcp/server.ts's `loginRepoPullShape` is removed -- dead on arrival in #9565, and
the first thing the newly-enabled noUnusedLocals caught on main. Which is the point of
this PR: dead code now surfaces at the commit that introduces it rather than at the next
audit.
The engine bump lands at 3.16.1 (main released 3.16.0 while this was open). It is required
by check-engine-parity: this PR removes two dead TYPE-only imports from
packages/loopover-engine/src/advisory/gate-advisory.ts, and the parity contract holds that
file in lockstep with its host twin src/rules/advisory.ts. There is no matching host edit to
make -- the engine copy is a deliberately slimmed re-implementation (#4881) omitting the
functions that use those types -- so the version bump is the sanctioned way to record a
one-sided change. No behaviour change: type-only imports are erased at compile time.
packages/loopover-miner/expected-engine.version moves with it, as its own check requires.
* chore(release): sync .release-please-manifest.json to the 3.16.1 engine bump
The manifest is a generated artifact that must move with any package.json version, and
release-manifest:sync:check fails CI when it drifts. Regenerated with the repo's own
`npm run release-manifest:sync` rather than hand-edited.
* chore: prune the dead symbols the new flags caught in newly-merged code
Rebase onto main after #9579 and #9580 landed. The newly-enabled noUnusedLocals
immediately flagged twelve dead symbols in code merged since this PR opened -- including
two I left in #9580 myself:
- src/queue/processors.ts: PrCommandPrologueOutcome imported but unused (the adapter's
annotated return type was dropped in favour of inference), plus eight unused bindings
in the prologue destructures -- handlers that do not need `pr`, `settings`,
`authorization` or `command` were still pulling them out.
- src/queue/pr-command-prologue.ts: LoopOverMentionCommandName, superseded by
LoopOverActionCommandName once the spec narrowed to action verbs.
- src/mcp/dispatch-telemetry-sink.ts: an unused McpToolCallTelemetry import from #9579.
Which is the point of the PR: the flags catch dead code at the commit that introduces it
rather than at the next audit. Zero behaviour change -- every removal is a binding or an
import TypeScript proved unreferenced, and the suite passes 24,014 tests.
The rebase conflict itself was in processors.ts's import block: main added the
pr-command-prologue import on the same lines this PR removed the unused runRetentionPrune
one. Both intents kept.
1 parent 423f410 commit 1943d88
79 files changed
Lines changed: 147 additions & 1001 deletions
File tree
- packages
- loopover-engine
- src
- advisory
- scoring
- signals
- loopover-miner
- lib
- scripts
- src
- api
- db
- github
- mcp
- queue
- review
- selfhost
- services
- signals
- test
- integration
- unit
- discovery-index
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
16 | | - | |
17 | 16 | | |
18 | 17 | | |
19 | 18 | | |
20 | | - | |
| 19 | + | |
21 | 20 | | |
22 | 21 | | |
23 | 22 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
51 | 51 | | |
52 | 52 | | |
53 | 53 | | |
54 | | - | |
55 | | - | |
56 | | - | |
57 | | - | |
58 | | - | |
59 | 54 | | |
60 | 55 | | |
61 | 56 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
28 | 28 | | |
29 | 29 | | |
30 | 30 | | |
31 | | - | |
| 31 | + | |
32 | 32 | | |
33 | | - | |
34 | 33 | | |
35 | 34 | | |
36 | 35 | | |
37 | 36 | | |
38 | | - | |
39 | 37 | | |
40 | 38 | | |
41 | 39 | | |
42 | 40 | | |
43 | | - | |
44 | 41 | | |
45 | 42 | | |
46 | 43 | | |
47 | 44 | | |
48 | 45 | | |
49 | | - | |
50 | 46 | | |
51 | 47 | | |
52 | 48 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
4 | 3 | | |
5 | 4 | | |
6 | 5 | | |
| |||
11 | 10 | | |
12 | 11 | | |
13 | 12 | | |
14 | | - | |
15 | | - | |
16 | | - | |
17 | | - | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
18 | 19 | | |
19 | 20 | | |
20 | 21 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
28 | | - | |
| 28 | + | |
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
35 | 35 | | |
36 | | - | |
| 36 | + | |
37 | 37 | | |
38 | 38 | | |
39 | 39 | | |
40 | 40 | | |
41 | 41 | | |
42 | | - | |
43 | | - | |
| 42 | + | |
44 | 43 | | |
45 | 44 | | |
46 | 45 | | |
| |||
Lines changed: 0 additions & 8 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | | - | |
3 | 2 | | |
4 | 3 | | |
5 | 4 | | |
| |||
46 | 45 | | |
47 | 46 | | |
48 | 47 | | |
49 | | - | |
50 | | - | |
51 | | - | |
52 | | - | |
53 | | - | |
54 | | - | |
55 | | - | |
56 | 48 | | |
57 | 49 | | |
58 | 50 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
| 1 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
282 | 282 | | |
283 | 283 | | |
284 | 284 | | |
285 | | - | |
| 285 | + | |
286 | 286 | | |
287 | 287 | | |
288 | 288 | | |
| |||
0 commit comments