What the measurements mean
Only what is unusual for this project. Every sentence names the field it came from; nothing here is asserted that cannot be checked against the data.
- 1,472,468 of its 1,919,770 measured lines are not authored code — mostly Candidates, which is why the headline figure is 447,302 rather than the raw count. attribution authored_linesfrom code_lines, authored_lines, line_accounting
- At 447,302 authored lines it is one of the larger things here, roughly 53x the median project in this estate. authored_linesfrom authored_lines
- Its Python averages 223 lines per callable against an estate median of 28, which points to long functions or to generated code sitting in the count.see the evidencefrom programming_languages, pythonAst.counts
- The code defines 84 functions, 141 methods and 38 classes. Only 18 of its 19 Python files were parsed, so those are floors rather than totals.see the evidencefrom pythonAst.counts, pythonAst.coverage
How it works
Screeners are easy to write and hard to trust. The data arrives from web pages that change, and a ranking is only as good as its inputs. So this one drives a real browser rather than relying on an API that may not exist. It refreshes selectively, fetching only missing metadata and updating only stale prices, so each run builds on the last instead of scraping everything again. Prices, metadata and detected events are kept in separate tables. Research experiments are stored as records too. That means a ranking can be revisited with the data as it was at the time, rather than as it is now.
What kind of engineering this is
Six signals counted from the source: files that run models locally, that act without being asked each time, that check their own output, that survive failure, that touch parsers and protocols, and that were measured then improved. Every axis carries its file count.
What it is written in
Share of code bytes. Vendored bundles and generated output are set aside before this is computed, which is why it differs from a simple file count.
What stands out
- It collects data by driving a browser instead of relying on an undocumented API.
- It refreshes incrementally, fetching only missing metadata and only stale prices.
- Research experiments and detected events are stored so they can be replayed later.
- Each run produces an HTML report, kept separate from the source data.
Capabilities
- Test Window - Should Stay Open
- Click Me - Updates Label
- Fetch Missing Metadata Only
- Update Stale Price Data
- Export Report
- By Exchange
- By Sector
- Clear Filters
- Search Help
- Filters cleared
Grade
Every check names the field it measured. Checks that cannot apply are excluded, never counted as failures.
- provenance71.4%
- documentation100.0%
- runnability62.5%
- maintenance100.0%
- integrity60.0%
Not met
- committed 5 uncommitted file(s), untouched 88 days; last commit 283 days ago
cd the project folder && git status - environment .venv exists but cannot run
python -m venv --clear .venv (in the project folder then reinstall from the manifest - environments_all 2 environments: .venv, StockGrabber/.venv
rebuild .venv, StockGrabber/.venv, because the service it belongs to cannot start without it - unresolved_flags 3 open flag(s)
atlas triage - attribution 23% of measured lines are authored
check excluded_dirs on the project page
Architecture
Directories carrying real modules, largest first.
(root)7 modulesutilities4 modulesStockGrabber2 modulessentiment_agent1 module
Data model
Typed structures and tables found in the source.
- daily_prices
- stock_metadata
- stock_metadata_extended
- research_experiments
- research_detected_events
- research_ticker_summaries
- research_failures
- research_parameter_sets
- table
- ScraperConfig
- Stock
- SERPResult
Vulnerable dependencies
20 declared dependencies match a published advisory. Checked offline against the OSV database; only pinned versions can be checked, so anything unpinned here is unknown rather than clean.
- Act now.
certifi2026.1.4→ 2026.10.18GHSA-6q48-6c7w-9gw2, PYSEC-2026-4320 - Act now.
certifi2026.1.4→ 2026.10.18GHSA-6q48-6c7w-9gw2, PYSEC-2026-4320 - Act now.
curl-cffi0.13.0→ 0.15.0GHSA-qw2m-4pqf-rmpp, PYSEC-2026-2431 - Act now.
lxml6.0.2→ 6.1.0GHSA-vfmq-68hx-4jfw, PYSEC-2026-87 - Act now.
lxml6.0.2→ 6.1.0GHSA-vfmq-68hx-4jfw, PYSEC-2026-87 - Act now.
pillow12.1.0→ 13.0.0GHSA-22hg-r758-rrw9, GHSA-24rc-8hj2-v98c, GHSA-254f-3936-288h - Act now.
protobuf6.33.4→ 6.33.5GHSA-7gcm-g887-7qv7, PYSEC-2026-1805 - Act now.
setuptools63.2.0→ 78.1.1GHSA-5rjg-fvgr-3xxf, GHSA-cx63-2mw6-8hw5, GHSA-h35f-9h28-mq5c - Act now.
setuptools63.2.0→ 78.1.1GHSA-5rjg-fvgr-3xxf, GHSA-cx63-2mw6-8hw5, GHSA-h35f-9h28-mq5c - Act now.
soupsieve2.8.3→ 2.8.4GHSA-2wc2-fm75-p42x, GHSA-836r-79rf-4m37, GHSA-gjv8-xp57-g29c - Act now.
soupsieve2.8.3→ 2.8.4GHSA-2wc2-fm75-p42x, GHSA-836r-79rf-4m37, GHSA-gjv8-xp57-g29c - Act now.
urllib32.6.3→ 2.8.0GHSA-8988-9cw3-xx77, GHSA-gh4c-6fx4-qh6g, GHSA-mf9v-mfxr-j63j - Act now.
urllib32.6.3→ 2.8.0GHSA-8988-9cw3-xx77, GHSA-gh4c-6fx4-qh6g, GHSA-mf9v-mfxr-j63j - Should fix.
diskcache5.6.3no fix publishedGHSA-w8v5-vhqr-4h9v, PYSEC-2026-2447 - Should fix.
idna3.11→ 3.15GHSA-65pc-fj4g-8rjx, PYSEC-2026-215 - Should fix.
idna3.11→ 3.15GHSA-65pc-fj4g-8rjx, PYSEC-2026-215 - Should fix.
pip25.3→ 26.1GHSA-58qw-9mgm-455v, GHSA-6vgw-5pg2-w6jp, GHSA-jp4c-xjxw-mgf9 - Should fix.
pip25.3→ 26.1GHSA-58qw-9mgm-455v, GHSA-6vgw-5pg2-w6jp, GHSA-jp4c-xjxw-mgf9 - Should fix.
requests2.32.3→ 2.32.4GHSA-9hjg-9r4m-mvj7, GHSA-gc5v-m9x4-r6x2, PYSEC-2026-1872 - Should fix.
requests2.32.5→ 2.33.0GHSA-gc5v-m9x4-r6x2, PYSEC-2026-2275
Vocabulary
Parsed 18 of 19 Python file(s); the rest were over the size budget.
Classes
TestWindowcheck_if_closing.py:11__init__, on_click, check_alive, closeEventTestWorkertest_crash_debug.py:88runTestReceivertest_crash_debug.py:104__init__, on_resultMinimalWorkertest_minimal_gui.py:16__init__, runMinimalWidgettest_minimal_gui.py:72__init__, test_fetch, on_progress, on_result, on_finishedStockScreenerWidgetstock_screener_widget.py:4__init__, show_help, apply_preset, clear_all_filters, run_screen, populate_table, view_stoSimpleWidgettest_standalone_metadata.py:21__init__, testMainWindowtest_standalone_metadata.py:104__init__DatabaseDashboardWidgetdatabase_dashboard_widget.py:3__init__, create_stat_card, create_completeness_tab, create_update_tab, create_stats_tab,HelpDocumentationWidgethelp_documentation_widget.py:3__init__, create_getting_started, create_strategy_guide, create_screener_guide, create_datEnhancedDataBrowserWidgetenhanced_data_browser_widget.py:3__init__, load_filter_options, show_search_help, clear_search, perform_search, show_all_tiAggregatesWindowenhanced_data_browser_widget.py:389__init__, create_overview_tab, create_sector_tab, create_exchange_tab, create_valuation_taStockDetailsWindowenhanced_data_browser_widget.py:605__init__, create_overview_tab, create_chart_tab, update_chart, on_hover, on_scroll, on_cliExchangeConfigutilities/exchange_config.py:16ExchangeSpecStockGrabber/GetStockTickets.py:57Settingsutilities/combine_symbol_csvs.py:35MarketDButilities/build_us_symbols_csv.py:152__init__, create_table, get_last_date, save_data, get_history, closeFetchOutcomeutilities/build_us_symbols_csv.py:222AdaptiveThrottleutilities/build_us_symbols_csv.py:231__init__, on_success, on_throttle, on_timeout_or_error, sleepBatchScanWorkerutilities/build_us_symbols_csv.py:528__init__, run, stopLivePriceWorkerutilities/build_us_symbols_csv.py:611__init__, update_tickers, run, stopHistoryWorkerutilities/build_us_symbols_csv.py:657__init__, runAnalysisWindowutilities/build_us_symbols_csv.py:675__init__, recalc, plot_chartDetailCardutilities/build_us_symbols_csv.py:750__init__, emit_analyze, update_data
Functions
maincheck_if_closing.py:54write_progresssentiment_runner.py:34mainsentiment_runner.py:49check_skip_signalsentiment_runner.py:189skip_signal_monitorsentiment_runner.py:209progress_callbacksentiment_runner.py:221result_callbacksentiment_runner.py:230make_serializabletest_crash_debug.py:49maintest_minimal_gui.py:174test_yfinance_fetchtest_extended_metadata.py:24test_extended_fieldstest_extended_metadata.py:51test_database_schematest_extended_metadata.py:92test_serializationtest_extended_metadata.py:148make_serializabletest_extended_metadata.py:163test_full_workflowtest_extended_metadata.py:194maintest_extended_metadata.py:254test_single_tickertest_yfinance_metadata.py:12compare_multiple_tickerstest_yfinance_metadata.py:86maintest_yfinance_metadata.py:128maintest_standalone_metadata.py:116get_suffix_for_exchangeutilities/exchange_config.py:58get_exchange_for_suffixutilities/exchange_config.py:65get_enabled_exchangesutilities/exchange_config.py:69get_exchange_by_nameutilities/exchange_config.py:73
Command line
- --input
- --db
- --output
- --progress
- --lmstudio-url
- --smoke-test
- --use-browser
- --headless
- --no-headless
- --max-results
Depth
Signals counted from the code, not asserted.
12 commits across 6 separate working days over 1 months, 5 of them revising existing behaviour
Built from scratch
- Parser / lexer
- Concurrency primitives
Proves itself
- Golden / baseline files
- Smoke tests
- Reconciliation / audits
Survives failure
- Logging / observability
- Fallback paths
- Timeouts
- Recovery / restore
- Retry / backoff
- Rate limiting
Local inference
- LM Studio
Systems
Environment engineering
- Dependency isolation
- Virtual environments
- Bootstrap scripts
Working within limits
- Timeout budgets
Languages
- Python50,155
- Batchfile109
- PowerShell70
Built with
- PyQt
- pandas
- NumPy
- Playwright
- BeautifulSoup
- pip
Recurring themes in the commit history
- flow
- enhancements
- calculations
- accuracy
- adjustments
- research
- advanced
Evidence
Taken from the code itself: a module docstring or the opening of the README.
Standalone sentiment analysis runner. Runs in a separate process to avoid PyQt6 threading issues with Playwright. Playwright's sync_playwright() creates browser resources tied to the calling thread, which conflicts with Qt's thread management and causes segfaults. Usage: python sentiment_runner.py --input tickers.json --db market_data.db --output result.json The script: 1. Reads ticker list from i
At a glance
- Status
- paused
- Primary language
- HTML
- First commit
- 2026-01-24
- Last activity
- 2026-02-03
- Domain
- Automation & scraping
- Agent docs
- CLAUDE.md, AGENTS.md, .claude