All notable changes to SciTeX will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
_LazyModuleerror messages now name the canonical attribute home when one exists. Whenscitex.<short>.<attr>lookup fails because<short>is not installed (extras gate) or because<short>is installed but doesn't carry<attr>(the "phantom" case), the resulting error now routes through a curated redirect map (scitex._canonical_redirects). Example:scitex.gen.load_configs(which doesn't exist inscitex_gen) used to raiseImportError: scitex.gen requires additional dependencies. Install with: pip install scitex[gen]— telling the user to pip-install a heavy extras package (torch + CUDA + …) that doesn't even contain the function. Now it raisesImportError: scitex.gen.load_configs is not available here; the canonical location is scitex.io.load_configs (already installed by the umbrella core — no extra needed). Change your import tofrom scitex.io import load_configs``. Same upgrade for theAttributeErrorpath when the module loaded fine but doesn't have the attribute. Seed redirect entries (gen → io / session / dict / str / etc / context / types) come from proj-paper-ripple-wm's PR#4a misdirected- callsite audit (2026-06-07) — the mngs.gen kitchen-sink namespace was split across multiple scitex peers, leaving hundreds of callsites pointing at `scitex.gen.` for `X` that now lives elsewhere.pip installhints now use{sys.executable} -m pip. The previous barepip install scitex[...]hint risked installing into a system-level Python when the user had an active virtualenv. Switched to{sys.executable} -m pip install 'scitex[<extras>]'so the install lands in the venv the user is currently running. Quotes the extras spec so shells that glob square brackets (zsh) don't choke. Applied to both_LazyModule.__getattr__'s ImportError fallback and the__dir__()missing-module warning.scitex.securityrepointed toscitex_audit.githubper ADR-0001 (scitex-dev #139, Accepted 2026-06-07).scitex-securitywas absorbed intoscitex-audit0.2.0; the 5 public symbols (check_github_alerts,save_alerts_to_file,get_latest_alerts_file,format_alerts_report,GitHubSecurityError) now live inscitex_audit.github. The umbrella_LazyModule("security", external="scitex_audit.github")resolution- the
external_alias_map"security" entry both move atomically. (#322)
- the
clickpromoted to a hard core dependency (click>=8.0.0in[project.dependencies]). Thescitex-pkgconsole-script (scitex.cli.pkg:pkg) does an unguarded module-loadimport click, so PS-213 (console-script-deps-must-be-core, scitex-dev v0.17.10+) requires click in core — barepip install scitexfollowed byscitex-pkg --helpno longer raisesModuleNotFoundError. (#328)- Umbrella sub-package pins bumped to PyPI latest to satisfy PS-170
(audit-umbrella-pins freshness gate) — unblocks the
testsmatrix that was red onmainsince 2026-06-09:scitex-dev0.17.4 → 0.17.10,scitex-io0.2.20 → 0.3.1,scitex-stats0.2.23 → 0.2.24,scitex-db0.1.11 → 0.1.12,scitex-msword0.2.0 → 0.3.2,scitex-dataset0.3.10 → 0.4.0,scitex-writer2.17.3 → 2.17.5,scitex-agent-container0.21.9 → 0.21.11. 18 occurrences updated across[project.dependencies], module extras,[dev], and tooling extras. (#329)
scitex._canonical_redirectsmodule — private helper carrying the(short, attr) → canonical_shortmap and the two hint builders (missing_extras_hint,phantom_attr_hint). Extracted fromscitex.re_exportto keep the latter under the 512-line file cap. Pinned by 27 tests acrosstests/scitex/test_canonical_redirects.pyandtests/scitex/test_lazymodule_redirects.py.[security]extra now installsscitex-audit>=0.2.0(was empty). Brings the umbrella extras into compliance with skill 03 §8 "every module MUST have an extra listing its standalone package". (#322)scitex-auditpinned to==0.2.0in main deps,[audit],[dev], and[all]. (#322)
scitex-security==0.1.4from main deps and[all]— absorbed intoscitex-audit. The deprecatedscitex-security0.2.0 PyPI shim is NOT pulled by the umbrella; users who explicitly depend on the old package still get aDeprecationWarningredirecting them toscitex_audit.github. (#322)
from scitex_security import X→from scitex_audit.github import X, or justscitex.security.X(now resolves to the same SSOT).scitex-security check OWNER/REPO --save→scitex-audit github --repo OWNER/REPO --save. The legacy console-script hard-errors with a redirect per CLI-deprecation skill 11 §5.~/.scitex/security/auto-symlinks to~/.scitex/audit/github-alerts/on first import ofscitex_audit(one-shot, marker-gated).
- Umbrella decomposition campaign:
scitex.<x>modules are now thin branded aliases to their owning standalone packages instead of in-tree shim directories. Dropped the in-tree shim dirs forerrors(→scitex_logging),torch(→scitex_linalg),stats(→scitex_stats),diagram(→figrecipe.diagram),clew(→scitex_clew),tunnel(→scitex_ssh),rng/verify.scitex.utilsis now a thin re-export aggregator that distributes implementations to their owning packages. Env-loading delegates toscitex-config. - Linter:
scitex.linter(and the more-consistentscitex.dev.linter) now resolve to the real enginescitex_dev.linter. Two stale registrations that kept routing to the archivedscitex_linterdistribution were removed (#306).
scitex-coredependency: dropped frompyproject.toml; all formerscitex-corecontents are standalonized. Enables public-archiving ofscitex-core. (#299)scitex.utils.verify_scitex_format: removed; superseded by thescitex-devlinter. (#300)- Dropped 10 redundant legacy MCP bridge files now covered by registry auto-mount.
- CI test matrix: greened the chronic-red umbrella matrix — switched to
uvresolver, CPU-only torch, dropped coverage-triggered segfaults, and added a retry-on-incomplete-report guard for the non-deterministic C-extension shutdown segfault. (#303, #304, #305) - Bumped sibling pins for PS-170 freshness (
scitex-dev0.15.0, et al.).
- Dependency pins: Restore
>=minima for siblingscitex-*deps (was exact==, which referenced unpublished versions likescitex-config==0.3.3and brokepip install scitexwith ResolutionImpossible). Fixes #282. The 2.29.0 and 2.29.1 PyPI releases shipped the broken==pins; 2.29.3 is the corrected release.
- Umbrella simplification (Tier 2 batch 6): Collapsed 8 leaf-duplicate dirs (
benchmark,context,cv,introspect,msword,os,security,tex) into eager-mounted external pointers. Trimmed ~hundreds of LOC fromsrc/scitex/.
- Import-path regression: Re-added 4 tiny shim dirs (
ml,reproduce,rng,verify) soimport scitex.mletc. continue to work alongside the existingscitex.<aliased>proxy. Each shim emits aDeprecationWarningthen re-exports from the canonical location (scitex.ai,scitex.repro,scitex.clew).
- Umbrella simplification (Tier 1 + Tier 2 batches 1–5): Collapsed 21 pure re-export directories —
dt,etc,gists,audit,compat,repro,app,scholar,dict,notebook,str,logging,browser,parallel,path,db,audio,types,template, plus 4 deprecated alias dirs — into eager-mounted external pointers insrc/scitex/__init__.py. ~8,000 lines removed across 8 PyPI releases. - Pin tightening: Tightened
>=floors for ~30 standalone packages whose APIs are now load-bearing for the umbrella (one PyPI install pulls a known-compatible matrix).
- License classifier: Drop legacy
License :: OSI Approvedtrove classifier — PEP 639 + setuptools ≥80 reject it (E5C13). - DSP/gen edge cases:
gen.to_evenhandles 0-d numpy/torch arrays via.item();dsp.design_filtercoerces tensorfsto scalar beforeint(); Hilbert + signal_fn cascade preservesfloat64dtype. - Stats compatibility shim: Register
scitex_stats._utilsatscitex.stats._utilssys.modules path so downstreamfrom scitex.stats._utils import Xkeeps working post-extraction.
- Module-level
_skills/: 302 sub-skill files across 70 modules, surfacing per-API guidance to MCP clients. - Skills CLI:
scitex skills get alldumps every sub-skill, not justSKILL.md. - Notebook: Unified migration mode for Jupyter → SciTeX conversion.
- Template:
list-code-templatesCLI command.
- Skills layout: Cleaned legacy
skills/directory; module-level_skills/<short>/is now the source of truth (later moved to scitex-dev in 2.28.x). - CLI skills export: Clean
--paramhandling, frontmatter normalised.
- Browser:
save-as-pdftool with cookie-banner dismissal; playwright-cli runtime detection. - Browser skills: First-class
_skills/browser/set.
- FastMCP compatibility:
mount(..., namespace=)for FastMCP 3.x andmount(..., prefix=)for 2.x via_compat.safe_mount.
- Lazy-loaded module skeletons for
introspect,sh,os,cv,ui,git,schema,canvas,security,benchmark,bridge,browser,compat,cli. scitex-pkg auditCLI for venv drift detection + auto-fix.
- Numerous lazy-loader, optional-dep, and deprecation-warning fixes (see git log between v2.25.0 and v2.26.0 for the full punch list).
- First wave of standalone-package extractions (#51, #206):
etc,compat,audit,parallel,types,gists,path,repro,db,scholar,dict,logging,browser,strand others — umbrella now delegates to dedicated PyPI packages with try/except fallbacks for unpublished ones. - Notebook unified migration mode, template list-code-templates, scholar
clean_abstractre-export.
- Default
autolayout=Falsein plt + session (#214); CLI warns when top-level--jsonis given with a subcommand (#211); session final-message differentiated byexit_status(#145); decorators lazy-importjoblib; io lazy-importsflask(#441); LazyGroup tolerant of optional-dep leaks (#279).
- Media classify: Add graphviz (.dot, .gv) and .mermaid extensions to media type detection
- MCP handlers: Project handler improvements
scitex.git.ls_remote(): Get remote ref commit hash viagit ls-remotescitex.git.get_head_hash(): Get local repo HEAD commit hash- Smart template cache: Validates cache by comparing local vs remote commit hashes; auto-invalidates stale cache
build_from_dois(): Build citation networks from multiple seed DOIs with batch scoringbuild_from_query(): Build citation networks from text queries via local DB search- Batch SQL optimization:
get_combined_similarity_scores_batch()— O(4) queries instead of O(4N) - HTTP parallel batch:
ThreadPoolExecutorparallelism for HTTP-mode batch scoring (up to 20 workers) is_seedflag: PaperNode now tracks whether it's a seed paperseed_doisfield: CitationGraph stores all seed DOIs for multi-seed graphs
- Module Refactoring: Cleaned up root-level namespace, moved items to appropriate modules
INJECTEDsentinel →scitex.session.INJECTED(backward-compatible with deprecation warning)show_install_guide()→scitex.dev.show_install_guide()(backward-compatible with deprecation warning)Diagramclass →scitex.diagram.Diagram(backward-compatible with deprecation warning)ci()(confidence interval) →scitex.stats.descriptive.ci(also available viastx.gen.ci)
- New Lazy Modules: Added missing modules to root namespace
introspect,sh,os,cv,ui,git,schema,canvas,security,benchmark,bridge,browser,compat,cli
| Before (Deprecated) | After (Recommended) |
|---|---|
stx.INJECTED |
stx.session.INJECTED |
stx.show_install_guide() |
stx.dev.show_install_guide() |
stx.Diagram |
stx.diagram.Diagram |
stx.gen.ci() |
stx.stats.descriptive.ci() |
stx.gen.inspect_module() |
stx.introspect.inspect_module() |
stx.gen.check_host() |
stx.os.check_host() |
stx.gen.is_host() |
stx.os.is_host() |
stx.gen.verify_host() |
stx.os.verify_host() |
stx.gen.detect_environment() |
stx.context.detect_environment() |
stx.gen.is_notebook() |
stx.context.is_notebook() |
stx.gen.is_script() |
stx.context.is_script() |
stx.gen.get_notebook_path() |
stx.context.get_notebook_path() |
stx.gen.run_shellcommand() |
stx.sh.run_shellcommand() |
stx.gen.run_shellscript() |
stx.sh.run_shellscript() |
stx.gen.title_case() |
stx.str.title_case() |
- Unified MCP Server: Single FastMCP server with 106 tools across 10 modules
scitex mcp list: List all tools with column-aligned outputscitex mcp doctor: Check server health and configurationscitex mcp serve: Start server (stdio/sse/http transports)scitex mcp help-recursive: Show help for all MCP commands
- Scholar Module: Expanded from 5 to 23 MCP tools
- Added: enrich_bibtex, download_pdf, download_pdfs_batch, parse_bibtex
- Added: validate_pdfs, resolve_openurls, authenticate, check_auth_status
- Added: logout, export_papers, add_papers_to_project, parse_pdf_content
- Added job handlers: fetch_papers, list_jobs, get_job_status, start_job, cancel_job, get_job_result
- MCP CLI Tests: 10 new tests for mcp CLI commands
- MCP Architecture: Consolidated into
_mcp_tools/subpackage - Test Naming: Renamed MCP tests to module-prefixed convention (e.g.,
test_audio_handlers.py)
- Legacy module-specific MCP files (consolidated into unified server)
- Release workflow: Simplified version check (pyproject.toml only)
- Gitignore: Added
script_out/,.monitor_repository.sh.log
- Renamed
rng_manager→rng: Shorter, NumPy-aligned naming conventionstx.session.start()now returnsrnginstead ofrng_manager- All examples, docs, and tests updated to use new naming
- MCP Servers: Added graceful dependency handling with
MCP_AVAILABLEflag- Servers now provide helpful installation instructions when
mcppackage missing
- Servers now provide helpful installation instructions when
- GitHub Actions: Install time benchmark workflow with GitHub Pages deployment
- Dynamic shields.io badges for all modules at
badges/<module>.json - Weekly scheduled benchmarks and release-triggered runs
- Dynamic shields.io badges for all modules at
- README: Per-module install time badges in all module tables
- README: Removed stray
</details>tag, fixedstx.io.loadexample
- MCP Servers: Integrated MCP (Model Context Protocol) servers for LLM integration
scholar: Literature management with BibTeX operations, DOI resolution (11 tools)stats: Statistical testing with auto-recommendation, power analysis (10 tools)template: Project scaffolding from templates (4 tools)plt: Publication-quality plotting with style management (6 tools)canvas: Multi-panel figure composition (7 tools)diagram: Paper-optimized diagram generation with Mermaid/Graphviz (7 tools)
- CLI Commands: 7 new CLI command groups (113 new tests)
audio: Text-to-speech (speak, backends, check, stop)capture: Screenshot/monitoring (snap, start, stop, gif, info, window)repro: Reproducibility tools (gen-id, gen-timestamp, hash, seed)resource: System monitoring (specs, usage, monitor)stats: Statistical analysis (recommend, describe, save, load, tests)template: Project scaffolding (list, clone, info)tex: LaTeX operations (compile, preview, to-vec, check)
- Web Module: New
download_imagesfunction for batch image downloading with size filtering
- Obsolete MCP Servers: Removed standalone
src/mcp_servers/directory (18 servers, ~44K lines)- Replaced by integrated module structure at
src/scitex/<module>/mcp_server.py
- Replaced by integrated module structure at
- MCP server entry points now follow pattern:
scitex-<module>(e.g.,scitex-scholar,scitex-stats)
- Removed Modules: Deprecated
fig,fts, andcompatmodules have been removed - Canvas API:
position/sizeparameters renamed toxy_mm/size_mmfor clarity
- Removed legacy
Pltz*aliases and terminology - Reorganized maintenance scripts into
dependencies/directory - Simplified path module implementations
- Added installation time benchmark scripts
- Updated README with uv recommendations
- Consolidated visualization documentation into
docs/visualization/
- Dependency: Add direct
llvmlite>=0.39.0constraint to force Python 3.11+ compatible versionumap-learn>=0.5.4alone was insufficient;pynndescentstill pulled oldllvmlite==0.36.0
- Dependency: Pin
umap-learn>=0.5.4for Python 3.11+ compatibility (llvmlite issue)
- Documentation: Updated README to recommend
scitex[all]as primary installation
- CI/CD Infrastructure: Separate workflow files for all 41 modules
- Datetime Module: New
datetimemodule withdtalias for time operations - Comprehensive Test Suites: Major test improvements across modules
- AI module: 577 tests passing
- NN module: 498 tests passing
- IO module: 506 tests passing
- Writer module: 414 tests (expanded from 276)
- CLI module: 201 tests
- SH module: 149 tests
- Scholar module: Core and storage tests
- License: Updated to AGPL-3.0
- Updated README with improved installation section
- Reorganized project structure (removed unused externals directory)
- HTML tag order and markdown link syntax in README
- DSP module test failures (reduced from 154 to 78)
- Resource module test failures and source bugs
- Repro module JAX circular import bug
- Web module tests and source bugs
- Gen module tests improvements
- Added .env.zenrows to .gitignore to prevent credential commits
- FTS Bundle System: New node kinds for annotations and images
textkind for text annotations with fontsize, fontweight, alignmentshapekind for shapes (rectangle, ellipse, arrow, line) with stylingimagekind for embedded images
- Node Categories: Clear categorization of node kinds
- DATA_LEAF_KINDS: plot, table, stats (require payload data files)
- ANNOTATION_LEAF_KINDS: text, shape (no payload required)
- IMAGE_LEAF_KINDS: image (require payload image file)
- COMPOSITE_KINDS: figure (contain children)
- Theme Enhancements: FigureTitle and Caption dataclasses for attribute access
- Matplotlib Analysis Tools: Signature analysis tools in
dev/plt/mpl/ - CI/CD Improvements: Added module-specific coverage targets
- Reorganized demo plotters to
dev/plt/demo_plotters/subdirectory - Updated FTS examples to use new
kindattribute instead oftype - Theme figure_title and caption now use dataclass attribute access
- Various import and attribute access fixes across modules
- Stats module now has optional torch dependency with numpy fallback
- Deprecated VIS planning documentation (now in .gitignore)
- Made torch optional in stats module with numpy fallback
- Added cross-process FIFO queue for MCP audio server
- FTS bundle examples
- Updated existing examples for FTS compatibility
- Tests for FTS refactoring
- Core modules updated for FTS integration
- Consolidated error and warning classes in logging module