ARCLUX Progress — Backlog (still empty)
See PROGRES.md for the index. Split by topic from the original PROGRES-status.md.2026-08-15 — PLAN: detector quality gate (graph mutations + adversarial suite + scoring)
[STATUS UPDATE, 2026-08-15]: items 1 (graph-mutation tests, 11 tests), 2 (adversarial suite, 15 tests) and 3 (scoring gate, 19/19 both directions) are now implemented — suite green 474/474 (44 files). See “UPDATE: detector quality gate — graph mutations implemented” below.Status: Not Started Context. From a cross-project audit (MSCodeBase → ARCLUX). Claims were fact-checked against current code first so nothing already done gets re-done:
- 2026-08-15 detector work already gives every one of the 19 detectors a
positive/negative control with real fixtures (
tests/detector.test.ts,tests/core-detectors.test.ts,tests/detectors-wired.test.ts) - Python relative imports are fixed & tested (issue #429 —
tests/python-e2e.test.ts,tests/resolvePath.test.ts)
- Graph-mutation tests — nothing asserts that inserting an edge into an
acyclic graph makes
detectCircularDependencyfire (and removing it clears the finding). The evalmut “add_edge_to_make_cyclic” idea, in TS:tests/mutation-graph.test.ts— build a 3-module acyclic fixture, assert no cycle, add an edge, assert cycle + exact node set, remove, assert clean. - Adversarial edge-case suite —
tests/detectors-adversarial.test.ts:- minified one-liner (
def A():pass\ndef B():pass) → no crash - comment mentioning “A calls B, B calls A” → no false positive
if TYPE_CHECKING:conditional import → open question: real edge or skip? (tree-sitter currently extracts it as a real edge — confirm whether that’s desired before asserting)getattr(obj, "method")()dynamic call → dead-code detector must not flag, or flag withconfidence: "low"test_*.py/*.test.tsfiles → never flagged as dead
- minified one-liner (
- Scoring gate — one run (vitest or
scripts/): planted violation across all 19 detectors → all fire; clean fixture repo → all empty. Target: 19/19 both directions as a regression gate.
tests/fixtures/
and makeModule/makeRepository already exist. Importing Python evalmut
would add a second stack for a concept vitest covers natively.
Estimate: 6-10h (2-3h mutations, 3-4h adversarial, 1-2h scoring gate).
2026-08-15 — UPDATE: detector quality gate — graph mutations implemented
Status: Done (items 1-3 implemented)tests/mutation-graph.test.ts added (11 tests, vitest): mutation-style
suite for detectCircularDependency — acyclic baseline → 0 findings;
plant edge c->a → cycle with exact node set + canonical rotation
(issue #207); remove → clean (round-trip); forward-edge negative control;
2-node cycle; entry-point rotation dedup; second cycle joins existing one
without key collisions; unrelated-component mutation leaves finding
untouched; self-loop documented; live-mutation ≡ fresh-index equivalence;
sub-cycle excludes outsider node. Helpers mirror makeModule/makeRepository
from tests/core-detectors.test.ts; mutateImports fails fast on unknown
module ids. Full suite: 456/456 (42 files).
Item 2 landed in the same pass: tests/detectors-adversarial.test.ts
(15 tests). Source level (parsePython): minified one-liner, comment
mentioning a cycle / string literal containing an import can’t create
edges, invalid syntax tolerated (ERROR nodes), empty source. Detector
level: TYPE_CHECKING import is extracted as a real edge and closes a
cycle — pinned current behavior, OPEN QUESTION (skip type-only edges
at parse time?); test files with no importers are flagged as orphan and
side-effect-imported test files are flagged as dead — pinned, OPEN
QUESTION (exclude test files by convention like entry points?);
dynamic-call usage is invisible to detectDeadCode (documented scope
boundary — no call-extraction pass); namespace import counts as using
every export (no false positive). Also fixed a latent type-error class
uncovered while writing these: ResolvedImport.kind was missing in the
makeModule helpers of core-detectors/detector/guard-inventory/runDoctor
test files + a widened language param in runDoctor — all 5 files now
LSP-clean. Suite: 471/471 (43 files).
Item 3 (scoring gate): tests/detector-score.test.ts — registry-driven
meta-gate iterating all 19 detectors with minimal planted-violation and
clean fixtures: asserts every detector fires (positive) and stays empty
(negative), plus an exact denominator check (19). Result: 19/19
negative, 19/19 negative. Two product decisions surfaced by the
adversarial suite are tracked as issues: #458 (TYPE_CHECKING imports as
real edges) and #459 (test files flagged as orphan/dead). Suite:
474/474 (44 files).
Decisions #458/#459 implemented (Variant A): parsePython now skips
imports under if TYPE_CHECKING: / if typing.TYPE_CHECKING: — type-only
imports are not graph edges (a type-only cycle is no longer reported);
new packages/detectors/testFiles.ts (isTestFilePath) excludes test
files by convention from detectOrphanFiles / detectUnusedFiles /
detectUnusedExports / detectDeadCode (same pattern as entry points).
Adversarial tests flipped from pinned behavior to negative controls;
+6 tests (3 parser TYPE_CHECKING incl. non-guard control, 2 test-file,
isTestFilePath describe). Boundaries documented in issues #458/#459
(vitest.setup.ts not covered by the *.test.ts convention;
detectMissingExports untouched). Suite: 478/478 (44 files).
2026-08-13 — UPDATE: framework rule stubs — implemented
All 10 remaining rule stubs inpackages/rules/* (nextjs x4, nestjs x2,
express, vite, electron x2) are now implemented, wired into
apps/cli/verify.ts and packages/engine/contract.ts (13 rules total,
react/requirePropsTyping remains a documented deferral; 14 rules as of
2026-08-14 with laravel/requireController — issue #53). Test coverage
for issue #8 completed: graph, impact, indexer, pipeline, and per-language
parser suites — 141 tests / 20 files, vitest green. See the old entry
below for the historical stub list.
2026-08-15 — Test coverage expanded (detector, pipeline, impact)
Status: Done Addedtests/detector.test.ts (19 detector smoke tests, one per detector
covering basic signature/return type), tests/pipeline.test.ts (6 tests:
error handling for invalid options, AnalyzeRepositoryResult structure
validation, scanSummary shape check), tests/impact.test.ts (5 tests:
calculateAffectedFiles/buildImpactTree/traceConsumers/traceDependencies).
Tests are non-dogmatic placeholder level (no fixtures, signature-only —
detectors already have guard-inventory.test.ts with real fixtures) but
establish that all 19 detectors return arrays without crashing on an empty
repo. Verified: npx vitest tests/{detector,pipeline,impact}.test.ts green.
2026-08-15 — CLI commands stubbed out (open, verify, logs, edit)
[STATUS UPDATE, 2026-08-15]: logs and run are now WIRED into the CLI router (issue #465). open.ts and logs.ts remain placeholders; verify.ts and edit.ts were already real implementations. See status-infra.md.Status: Done Added 4 command files to
apps/cli/commands/:
open.ts— open analysis results in browser or editor (not yet implemented, honest placeholder with —browser/—editor flags)verify.ts— run all framework rules + detectors via runDoctor, output grouped by check, JSON support. Real implementation calling analyzeRepository + runDoctorlogs.ts— view daemon or CLI logs from ~/.arclux/logs/edit.ts— read current + replacement file, show diff preview, apply with —apply flag
2026-08-03 — ❌ STILL EMPTY (8-line stub, license header only)
Priority #1 — core feature — NOTE: this was previously miscategorized, see “packages/impact/ already done” update below* High priority:packages/db/*(5 files)components/workspace/*(5 files + 3 panels — all stubs)components/explorer/Explorer.tsx,DependencyList.tsx,ImpactSummary.tsxcomponents/overview/RepositoryHeader/Info/Overview.tsxcomponents/search/GlobalSearch.tsx(just needs to use the existingfuzzyScore.ts)- Remaining detectors (8 of 18 — see list above)
packages/cache/*,packages/watcher/*(5 & 4 files respectively)packages/git/*(checkoutBranch,detectDefaultBranch,getBranches,getCommitHistory,getContributors— different fromcloneRepository/cleanupRepository/readGitignore, which are already done)
[STATUS UPDATE, 2026-08-14]: resolved — all 5 are implemented. getBranches + detectDefaultBranch (git ls-remote, no clone) power GET /api/branches and the workspace branch switcher (see status-web.md); checkoutBranch/getCommitHistory/getContributors operate on a local clone (see status-core.md “packages/git history helpers”).
packages/graph/buildCallGraph/buildExportGraph/buildImportGraph.ts- Remaining
packages/indexer/*(indexSchema,resolveComponents/Exports/ Hooks/Providers/Routes,updateIndex,watchIndex) — the emptyresolveRoutes.tsis whydetectUnusedExportsis not yet entry-file-aware - Remaining
packages/rules/*(electron, express, nestjs, react, vite — 9 files,nextjs/*also still 3 of 4 stubs:requireIndexUpdate,requireLayoutUpdate,requireMetadata) packages/search/*(SearchEngine, SearchFilters, SearchIndex, SearchKeyboard, SearchProvider, SearchResults — different from the already-donefuzzyScore.ts, which isn’t yet plugged into these)packages/ui/*(5 files) — ⚠️ watch for duplication:graphColor.tshere vstheme/graphColors.tsinapps/web, which is already done — very similar names, same dead-code risk as a previous incident if someone writes content here without realizing a working version already existsapps/web/features/*(13 files — graph, impact, issues, repository, search stores/hooks, all stubs)- Remaining
apps/web/hooks/*(useClipboard, useCommandPalette, useDebounce, useMediaQuery) apps/web/lib/api.ts,lib/graph.tsapps/web/theme/motion.ts,spacing.ts,typography.ts- Other-language parsers: cpp, csharp, go, java, javascript
(parseCommonJs/Js/Jsx), php, ruby, rust — all 0%.
parser/config/*(json, packageJson, toml, yaml) also 0%.parser/core/parseImports.ts0%. parser/typescript/parseTsx.ts,parseTsConfig.ts— check first whether these really need separate implementation or the logic already lives inparseTs.ts(194 lines) before rewriting
scripts/*(4 files: benchmark, build, generateFixtures, release)tests/*(everything — detector, graph, impact, indexer, pipeline, per-language parser tests) — 0% total, there isn’t a single test in this project yet
2026-08-11 — Explorer.tsx exists but never mounted, likely contributes to weak first impression
[STATUS UPDATE, 2026-08-14]: RESOLVED — Explorer is now mounted as a right-hand panel on the graph page, opening when a file node is selected (see progres/status-web.md “Explorer panel mounted into the graph page”).Status: Done Confirmed via grep: zero references to Explorer in apps/web/app. Component exists, works standalone, but no page renders it. Worth prioritizing — a working workspace/explorer view is probably wha[…]
2026-08-14 — UPDATE: the 2026-08-03 “STILL EMPTY” list — mostly resolved
[STATUS UPDATE, 2026-08-14]: the 2026-08-03 ”❌ STILL EMPTY” list below is largely historical now. Resolved since then (see the individual status files):packages/search/*(issue #9, 6/6),graph/buildCallGraph.ts(issue #50),indexer/resolveRoutes.ts(issue #7), remaining hooks (issue #147, 3/3), all framework rule stubs (13→14 rules incl. laravel), tests (141→191). Still open: the resolver family isn’t attached to ModuleInfo by buildIndex, andExplorer/workspace/overviewpanels still aren’t mounted on any page.
2026-08-14 — Laravel framework rules (issue #53)
Status: Donepackages/parser/php/parsePhpRoutes.ts (new) extracts controller
references from routes/web.php/routes/api.php — v1 handles only the
array callable syntax [UserController::class, 'index']; closures and
string callables ('UserController@index') are documented as skipped.
packages/rules/laravel/requireController.ts (new) flags routes
referencing controllers with no file under app/Http/Controllers/.
Registered in both apps/cli/verify.ts and packages/engine/contract.ts;
framework detection extended to read composer.json (laravel/framework
→ laravel). Verified against real routes: monica (143 controllers
extracted, closures correctly skipped; DDD layouts give false
“missing” — documented v1 limitation) and laravel/laravel 11.x
(closure-only → 0 refs, correct). 8 tests (tests/rules-laravel.test.ts).