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