Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
406 commits
Select commit Hold shift + click to select a range
87ef013
fix(settings): repair broken API endpoint calls post-migration
patchmemory Feb 27, 2026
fb20cc0
fix(settings): resolve remaining 404s in chat behavior settings
patchmemory Feb 27, 2026
1b79eea
fix(settings): resolve global syntax error from smart quotes
patchmemory Feb 27, 2026
740d962
feat(database): add source, modified, validation_output fields to scr…
patchmemory Feb 27, 2026
e7f82b8
feat(analyses): bootstrap endpoint, validation, restore, and registry UI
patchmemory Feb 27, 2026
d7aa8c6
feat(links): bootstrap endpoint, validation, restore, and registry UI
patchmemory Feb 27, 2026
a040f94
feat(scripts): add GET endpoint for validation result display
patchmemory Feb 27, 2026
2ad44f4
feat(settings): create shared validation modal partial
patchmemory Feb 27, 2026
6d92585
feat(analyses): wire validation modal with click handlers
patchmemory Feb 27, 2026
58fd7e6
feat(links): wire validation modal with click handlers
patchmemory Feb 27, 2026
5d6933b
feat(labels): registry table with push status and sync detection
patchmemory Feb 27, 2026
25e0082
fix(files): correct Neo4j connection status display
patchmemory Feb 27, 2026
9269e38
feat(files): implement live vs snapshot view model
patchmemory Feb 27, 2026
4198034
feat(files): unified activity panel with snapshot index
patchmemory Feb 27, 2026
3fde7a9
feat(files): checkbox file selection mode with indeterminate states
patchmemory Feb 27, 2026
ad45ac0
feat(files): snapshot configuration modal and refresh/reconfigure flow
patchmemory Feb 27, 2026
329b19e
fix(files): correct activity panel wiring and modal display issues
patchmemory Feb 27, 2026
e215988
fix(files): resolve live servers and snapshot mode redundancy
patchmemory Feb 27, 2026
ec4b2c7
fix(files): resolve servers 500 error and snapshot mode empty state
patchmemory Feb 27, 2026
8eabe39
fix(files): resolve servers 500 error with defensive extension access
patchmemory Feb 27, 2026
6c769c3
fix(files): correct ProviderRegistry iteration in api_servers
patchmemory Feb 27, 2026
58b05cd
fix(files): maintain tree selection highlighting across modes
patchmemory Feb 27, 2026
2dccd2f
feat(interpreter): implement declared node write pipeline at commit time
patchmemory Feb 27, 2026
636202d
feat(interpreter): add Bruker SkyScan microCT log interpreter
patchmemory Feb 27, 2026
ec0eeff
feat(schema): integrate SciDK schema layer with sanitization pipeline
patchmemory Feb 28, 2026
5f1a38f
chore(dev): update submodule to include schema layer contracts
patchmemory Feb 28, 2026
192991e
feat(schema): implement Label schema push to Neo4j
patchmemory Feb 28, 2026
c71443e
fix(validation): skip Python checks for Cypher link scripts
patchmemory Feb 28, 2026
3628309
fix(ui): consolidate Links group and add Examples category
patchmemory Feb 28, 2026
a6b233e
feat(links): show wizard links in Settings → Links registry
patchmemory Feb 28, 2026
e72821f
fix(scripts): clean database and prevent root-level utility scripts f…
patchmemory Feb 28, 2026
2eb9020
fix(links): preserve group toggle state when clicking to expand/collapse
patchmemory Feb 28, 2026
987b083
fix(links): preserve group toggle state and standardize wizard display
patchmemory Feb 28, 2026
dd31ba9
feat(links): unify UI and show properties in results
patchmemory Feb 28, 2026
cbaeef0
fix(links): correct HTML structure - wizard now renders in right panel
patchmemory Feb 28, 2026
4969c15
fix(links): fix discovered relationships - dedupe, save, and details
patchmemory Feb 28, 2026
fd4b6f0
feat(links): add discovered relationship import with stub nodes
patchmemory Feb 28, 2026
1d1bc18
fix(links): serialize Neo4j objects and optimize instances query
patchmemory Feb 28, 2026
a56ed95
fix(links): discovered import wizard validation and scalar query fixes
patchmemory Feb 28, 2026
5014e65
fix(links): improve discovered relationship import wizard UX
patchmemory Feb 28, 2026
5ed1d4b
fix(links): display UID consistently and hide irrelevant buttons in d…
patchmemory Feb 28, 2026
900a09e
feat(links): add status field to link_definitions table
patchmemory Feb 28, 2026
d306851
feat(links): redesign Links page with Active/Pending/Available tabs
patchmemory Feb 28, 2026
1bdfa0d
fix(links): fix four bugs in Links page and import functionality
patchmemory Feb 28, 2026
6214c43
fix(links): add ORDER BY and detailed logging to discovered import pa…
patchmemory Feb 28, 2026
48dd6de
fix(links): add missing logger import in link_service
patchmemory Feb 28, 2026
7848d8a
fix(links): split preview count queries to avoid Neo4j aggregation li…
patchmemory Feb 28, 2026
474ca96
debug(links): add database source logging to preview functions
patchmemory Feb 28, 2026
4c0ce11
fix(links): preserve source database context in Available tab
patchmemory Feb 28, 2026
e36c379
fix(links): use exact node counts in preview_discovered_import
patchmemory Feb 28, 2026
6b21a68
feat(links): add progress tracking and auto-adopt for discovered imports
patchmemory Feb 28, 2026
4d4936f
fix(links): show correct total in import progress (X / 526,291)
patchmemory Feb 28, 2026
eab80cf
feat(links): add tqdm-style ETA to import progress
patchmemory Feb 28, 2026
9c0447e
fix(links): prevent state bleed between wizard panel sessions
patchmemory Feb 28, 2026
8585f65
fix(links): fix Pending link loading and add job progress recovery
patchmemory Feb 28, 2026
1be07d1
fix(links): call correct function updateDiscoveredImportDisplay
patchmemory Feb 28, 2026
bcf9b85
perf(links): increase batch size from 100 to 5000 for imports
patchmemory Feb 28, 2026
1c6e609
fix(links): ensure discovered import rel is set for display
patchmemory Feb 28, 2026
1f7a10f
fix(links): remove source_filters/target_filters from INSERT
patchmemory Feb 28, 2026
eb10c1e
debug(links): add detailed logging to import progress tracking
patchmemory Feb 28, 2026
ecdc5d9
fix(links): hide wizard buttons when loading discovered import links
patchmemory Feb 28, 2026
283b27f
fix(links): improve discovered import UX with cancel, delete, and key…
patchmemory Feb 28, 2026
78f6148
fix(links): add Cancel button to resumed import progress
patchmemory Feb 28, 2026
fa659b4
fix(links): align Pending tab count with render filter
patchmemory Feb 28, 2026
3bfe696
fix(links): include status field in list_all_links() normalized output
patchmemory Feb 28, 2026
4b6d733
feat(links): add unified refresh with Active verification, Available …
patchmemory Feb 28, 2026
11d0db5
fix(links): remove Primary from Available tab and deduplicate by trip…
patchmemory Feb 28, 2026
d3796dc
fix(links): show tab-specific total in "Showing X of Y" display
patchmemory Feb 28, 2026
a22be3a
feat(links): add sync status and "Sync Now" button to Active import l…
patchmemory Feb 28, 2026
ada47ff
fix(links): query primary database directly for accurate sync status …
patchmemory Feb 28, 2026
bc2f82a
feat(links): add paginated "View & Download" index panel to all tabs
patchmemory Feb 28, 2026
9940d6f
fix(links): clean up Active link UI and show index for all Active links
patchmemory Feb 28, 2026
a085c5a
fix(links): render sync status and index for Active links
patchmemory Feb 28, 2026
9b1f4b8
fix(links): handle missing UID properties in Active link index
patchmemory Feb 28, 2026
c698496
fix(links): show relationship index for Active links without match_co…
patchmemory Feb 28, 2026
55d7c8e
docs(links): clarify match_config fallback for wizard-defined links
patchmemory Mar 1, 2026
2c72ea9
fix(links): two bugs in Active import link UI
patchmemory Mar 1, 2026
7ad5616
refactor(links): extract JavaScript into separate module files
patchmemory Mar 1, 2026
ba84f66
refactor(links): clean read-only view for Active links with editable …
patchmemory Mar 1, 2026
e6533e1
feat(links): add relationship property enrichment for Active import l…
patchmemory Mar 1, 2026
ea68c29
fix(links): resolve cross-module scope issues in JavaScript modules
patchmemory Mar 1, 2026
3e7eb37
fix(links): preserve triple badge and restore UID auto-selection in A…
patchmemory Mar 1, 2026
7c7988f
feat(links): add property selection to Enrich Relationships section
patchmemory Mar 1, 2026
92b3779
fix: update stale test assertions for JS modularization and builtin c…
patchmemory Mar 1, 2026
2d0868f
test: add coverage for relationship enrichment endpoint
patchmemory Mar 1, 2026
02a68b5
fix(links): correct import path for get_settings_by_prefix in _try_ap…
patchmemory Mar 1, 2026
6477bf8
feat(security): add Security Overview page to Settings
patchmemory Mar 1, 2026
3681a68
fix(security): make Users link navigate correctly via onclick
patchmemory Mar 1, 2026
5d8873c
feat(interpreters): add Bio-Formats integration layer
patchmemory Mar 2, 2026
0ca9b2f
feat(interpreters): register Bio-Formats interpreters
patchmemory Mar 2, 2026
c5f6741
test(interpreters): add Bio-Formats integration tests
patchmemory Mar 2, 2026
ad787bc
docs(bioformats): add comprehensive setup guide
patchmemory Mar 2, 2026
6c33809
docs(interpreters): add comprehensive imaging interpreter template
patchmemory Mar 2, 2026
c7354c3
docs(contracts): update interpreter contract to class-based standard
patchmemory Mar 2, 2026
4a64440
feat(interpreters): add Bruker MicroCT composite dataset interpreter
patchmemory Mar 2, 2026
2096a0b
feat(chat): Sprint 1 — ChatSEEK patterns + intent routing + query lib…
patchmemory Mar 2, 2026
b9bae53
fix(tests): resolve 4 pre-existing test failures + 2 env issues
patchmemory Mar 2, 2026
dda2803
Merge origin/main into production-mvp
patchmemory Mar 2, 2026
18ce8df
fix(intent_classifier): remove stray quote in regex pattern
patchmemory Mar 2, 2026
03799a3
Merge branch 'main' of github.com:patchmemory/scidk into production-mvp
patchmemory Mar 2, 2026
80c3329
fix: enable VPN access and fix DriveInfo API error
patchmemory Mar 2, 2026
8e86c4b
fix: enable first-time admin user setup without authentication
patchmemory Mar 2, 2026
0b485ff
fix: add reverse proxy subpath support for /scidk deployment
patchmemory Mar 2, 2026
3b37ce0
fix: fix login/logout redirects for subpath deployments
patchmemory Mar 3, 2026
061ffc0
fix(auth): add SCIDK_BASE to login.html for subpath deployment
patchmemory Mar 3, 2026
c441c29
fix(templates): fix remaining SCIDK_BASE misses in login and settings
patchmemory Mar 3, 2026
2270d73
fix(frontend): SCIDK_BASE for static JS files and remaining template …
patchmemory Mar 3, 2026
80b173a
feat(ui): add knowledge graph favicon
patchmemory Mar 3, 2026
74e9eef
fix(config): load .env automatically via python-dotenv
patchmemory Mar 3, 2026
0208b17
fix(deps): add python-dotenv to requirements.txt
patchmemory Mar 3, 2026
2997a62
fix(frontend): complete SCIDK_BASE audit - fix all remaining hardcode…
patchmemory Mar 3, 2026
8219284
fix(frontend): fix URL variable patterns missed by SCIDK_BASE audit
patchmemory Mar 3, 2026
772c349
fix(links): auto-refresh relationship index when UID property changes
patchmemory Mar 3, 2026
900cbc0
fix(links): restore triple display visibility when switching from Act…
patchmemory Mar 3, 2026
8d9c978
fix(links): fix Refresh button and relationship index for Active links
patchmemory Mar 3, 2026
5beb3ec
fix(neo4j): connect profile system to app startup + encrypt passwords
patchmemory Mar 3, 2026
85b31af
Revert "fix(neo4j): connect profile system to app startup + encrypt p…
patchmemory Mar 3, 2026
ea718b3
fix(links): add Save button to Available links and filter Read-Only f…
patchmemory Mar 3, 2026
8bbd041
ci(e2e): resolve issues with map api link refactoring
patchmemory Mar 3, 2026
bd175eb
feat: Schema Intelligence Layer (Phases 1-3, 6)
patchmemory Mar 9, 2026
5196671
feat: Concept Graph infrastructure
patchmemory Mar 9, 2026
b747a16
feat: Concept Graph service layer and pipeline wiring
patchmemory Mar 9, 2026
c51b3c5
feat: Chat AI infrastructure (ReAct loop, summarization, cypher utils)
patchmemory Mar 9, 2026
05eb91a
feat: Chat service context retrieval
patchmemory Mar 9, 2026
ac4b07a
feat: Chat UI streaming and ReAct step visualization
patchmemory Mar 9, 2026
9c4f270
config: add concept graph, chat history, and schema intelligence env …
patchmemory Mar 9, 2026
417d334
chore: add gunicorn restart script and ignore log file
patchmemory Mar 9, 2026
e632798
test: add chat, intent routing, Neo4j, and streaming test suite
patchmemory Mar 9, 2026
446abd0
feat: schema intelligence export/import and label profile API
patchmemory Mar 10, 2026
b921d8c
feat: schema intelligence REST API endpoints (Phase 4+5)
patchmemory Mar 10, 2026
4a64f4e
feat: Chat Intelligence section in Labels page (Phase 4)
patchmemory Mar 10, 2026
8542f12
feat: Schema Intelligence settings section (Phase 5)
patchmemory Mar 10, 2026
13c0513
feat: Concept Graph Phase 2 — add traversal_log to SSE done events
patchmemory Mar 10, 2026
9c4df5f
feat: Concept Graph Phase 2 — reasoning block in chat UI
patchmemory Mar 10, 2026
296bd95
fix: expose toggleReasoning as global function for onclick handler
patchmemory Mar 10, 2026
033805d
feat: concept graph editor UI + fix summarize + fix edge warnings
patchmemory Mar 10, 2026
abc1cc1
fix: add Schema Intelligence and Concept Graph to settings sidebar na…
patchmemory Mar 10, 2026
2cd47c4
feat: enhance Chat History page with Neo4j chat graph info
patchmemory Mar 10, 2026
6f71cc8
fix: use raw message for intent classification, not conversation context
patchmemory Mar 10, 2026
a05ec19
feat: Schema Intelligence editable UI in Labels page (Phase 4B-D)
patchmemory Mar 10, 2026
27d88dc
feat: add Neo4j full-text indexes on string properties
patchmemory Mar 10, 2026
841c2fa
feat: MCP server scaffold (5 core tools, stdio transport)
patchmemory Mar 10, 2026
5d8da6e
feat: Concept Graph Phase 3 — decay, MCP tools, export/import
patchmemory Mar 10, 2026
5a5d8e0
fix: set last_updated in feedback loop for weight decay
patchmemory Mar 10, 2026
ec026fc
feat: Connections page consolidation + Schema Map
patchmemory Mar 10, 2026
c27ad24
refactor: native SUMMARIZE streaming + Cytoscape graph_utils
patchmemory Mar 10, 2026
0972be9
fix: wait for SciDKGraph to load before initializing graphs
patchmemory Mar 10, 2026
64fc765
fix: defer Cytoscape init until container is visible in DOM
patchmemory Mar 10, 2026
a4ff20e
fix: graph_utils.js stylesheet and element data issues
patchmemory Mar 10, 2026
ff9ca20
fix: correct edge field names in queryResultsToElements and schemaToE…
patchmemory Mar 10, 2026
49079db
debug: add extensive logging to queryResultsToElements
patchmemory Mar 10, 2026
12f5748
fix: handle node ID 0 correctly in _extractId
patchmemory Mar 10, 2026
40f6b90
debug: comprehensive edge/node ID logging
patchmemory Mar 10, 2026
f45a6eb
fix: deduplicate edges by ID in queryResultsToElements
patchmemory Mar 10, 2026
5624a51
cleanup: remove debug logging from queryResultsToElements
patchmemory Mar 10, 2026
4a12723
debug: add graph rendering diagnostics to chat.html
patchmemory Mar 10, 2026
fe67aae
fix: use SciDKGraph.init in renderGraph instead of manual cytoscape init
patchmemory Mar 10, 2026
b3de067
debug: add try/catch to expose actual errors in SciDKGraph.init and r…
patchmemory Mar 10, 2026
8114438
fix: preserve Cytoscape ID fields when merging properties
patchmemory Mar 10, 2026
a39adae
chore: Clean up debug logging from Cytoscape refactor
patchmemory Mar 10, 2026
c6ef8ac
feat(tools): add standalone filesystem scanner with magic byte detect…
patchmemory Mar 13, 2026
bc05562
chore: add scanner debug output patterns to .gitignore
patchmemory Mar 13, 2026
3c31a50
chore: update dev submodule with new docs and archived MVP planning
patchmemory Mar 13, 2026
23ba225
chore(dev): bump dev submodule to latest main (docs updates, .gitigno…
patchmemory Mar 13, 2026
3aefcfc
fix(neo4j): fall back to env vars when SQLite has no config (J1)
patchmemory Jun 25, 2026
3fd1087
fix(chat): define module logger and correct concept-graph imports (J3…
patchmemory Jun 25, 2026
3030396
fix(plugins): encrypt plugin credentials with Fernet (J9)
patchmemory Jun 25, 2026
cf0e192
docs: refresh guides and add CONTRIBUTING; sync security docs with code
patchmemory Jun 25, 2026
228b171
feat(profiles): add dataset match profile YAMLs and registry
patchmemory Jun 26, 2026
05a1bd0
feat(profiles): add pure profile matching logic
patchmemory Jun 26, 2026
ca399bc
feat(neo4j): create Dataset nodes after rclone scan commit
patchmemory Jun 26, 2026
f5f2899
test(profiles): cover matcher, registry, YAMLs, and dataset node service
patchmemory Jun 26, 2026
bd4492c
feat(datasets): wire Dataset node creation into background scan worker
patchmemory Jun 30, 2026
eca4d6a
feat(auth): add API token (Bearer) auth + harden admin decorator boot…
patchmemory Jun 30, 2026
c40f272
docs: add rclone setup guide
patchmemory Jun 30, 2026
aba445a
feat: Maps canvas mode Push 1 — toggle, node search, add-to-canvas
patchmemory Jul 20, 2026
d3d7db6
feat: Maps canvas Push 2 — edge drawing, provisional layer, session p…
patchmemory Jul 20, 2026
895152b
feat: Maps canvas Push 3 — commit flow, Cypher/Python export, snapsho…
patchmemory Jul 20, 2026
81bc7c7
feat: Maps canvas Push 4 — correct exports + RO-Crate
patchmemory Jul 20, 2026
20914df
feat: Maps canvas Push 5 — keystrokes, batch edges, undo/redo, sideba…
patchmemory Jul 21, 2026
ffeae2a
feat: Maps canvas Push 6 — selection inspector panel
patchmemory Jul 21, 2026
8c46264
fix: create Schema Intelligence tables on startup (Cycle 1, Task A)
patchmemory Aug 3, 2026
83b8687
fix: attribute properties to their own label, not every label (Cycle …
patchmemory Aug 3, 2026
21a1d97
fix: one scheduler per deployment, not one per worker (Cycle 1, Task C)
patchmemory Aug 3, 2026
6626b15
feat: schedule flush_rankings() every 6 hours (Cycle 1, Task D / J7)
patchmemory Aug 3, 2026
7fb00e8
fix: match MCP write keywords as tokens, not substrings (Cycle 2, Tas…
patchmemory Aug 4, 2026
2548f13
fix: guard the label before it reaches MCP Cypher (Cycle 2, Task B)
patchmemory Aug 4, 2026
0b8dbff
fix: attribute audit rows to g.scidk_user, not 'system' (Cycle 2, Tas…
patchmemory Aug 4, 2026
1880dcf
fix: require authentication for canvas export routes (Cycle 2, Task E)
patchmemory Aug 4, 2026
e774af1
feat: route MCP get_label_profile through schema intelligence (Cycle …
patchmemory Aug 4, 2026
38a7b7e
feat: implement the DataSourcePlugin contract for SharePoint (Cycle 3…
patchmemory Aug 4, 2026
78f6c9b
refactor: strip all ETL logic from the SharePoint plugin (Cycle 3, Ta…
patchmemory Aug 4, 2026
2791cdb
test: unit test the SharePoint transform library (Cycle 3, Task C)
patchmemory Aug 4, 2026
637b419
test: narrow the SharePoint tests to the plugin contract (Cycle 3, Ta…
patchmemory Aug 4, 2026
ee949f7
feat: the Pipeline ETL backend — mapping engine, runner, persistence …
patchmemory Aug 4, 2026
a0583d8
refactor: key canvas sessions by (user_id, context_id) and normalize …
patchmemory Aug 4, 2026
f4a42a5
feat: persistent jobstore so pipeline schedules take effect without a…
patchmemory Aug 4, 2026
e098e77
feat: Pipeline sources page, connection step, runs and scheduling (Cy…
patchmemory Aug 4, 2026
1759c01
test: make the Pipeline HTTP tests independent of any real Neo4j
patchmemory Aug 4, 2026
0d351f8
feat: Arrows.app schema format for a Pipeline source (Cycle 3B Task C)
patchmemory Aug 4, 2026
918d9d0
feat: schema routes for a Pipeline source (Cycle 3B Task C)
patchmemory Aug 4, 2026
65a3e14
feat: schema-space elements on the shared canvas (Cycle 3B Task C)
patchmemory Aug 4, 2026
1ce79a9
feat: the schema canvas, scoped to a Pipeline source (Cycle 3B Task C)
patchmemory Aug 4, 2026
0241870
feat: Step 2 of the add flow — the three schema entry points (Cycle 3…
patchmemory Aug 4, 2026
b5f933d
fix: three things a browser found in the schema canvas
patchmemory Aug 4, 2026
05b2e38
fix: keep schema labels out of the Maps styling sidebar
patchmemory Aug 4, 2026
eb50fcb
feat: Step 3 of the add flow — column mapping (Cycle 3B Task D)
patchmemory Aug 4, 2026
21d5644
feat: the FAIR check — what a run would write (Cycle 3B Task E)
patchmemory Aug 4, 2026
06cbbe8
feat: one Connections page for every graph backend (Cycle 4 Task A)
patchmemory Aug 4, 2026
f308f96
docs: say which security controls exist and which are aspirational (C…
patchmemory Aug 4, 2026
1ecb633
feat: one tool registry, three consumers (Cycle 6 Task A)
patchmemory Aug 4, 2026
acc0e69
test: pin the canvas RO-Crate export before refactoring it (Cycle 7 T…
patchmemory Aug 4, 2026
5cc4672
feat: one module that knows how the graph maps to an RO-Crate (Cycle …
patchmemory Aug 4, 2026
c7de8f7
feat: build an RO-Crate from a Files page selection (Cycle 7 Task B)
patchmemory Aug 4, 2026
fb31895
feat: draft an NIH DMS plan from the live graph (Cycle 7 Task C)
patchmemory Aug 4, 2026
c4f8a8f
refactor: move weight decay onto the scheduler seam Cycle 1 built (Cy…
patchmemory Aug 4, 2026
009c2c6
feat: carry the registry's tool category into the graph and back out …
patchmemory Aug 4, 2026
dcb003f
feat: a seeding entry point that does not need a running server (Cycl…
patchmemory Aug 4, 2026
974b15f
feat: export/import controls on the Connections Concept Graph card (C…
patchmemory Aug 4, 2026
1a13d69
refactor: fold the nav down to six researcher-facing pages
patchmemory Aug 4, 2026
478aa73
refactor: call them Resources, not Pipelines
patchmemory Aug 5, 2026
091d752
feat: a typed interpreter contract and a registry that dispatches on it
patchmemory Aug 7, 2026
3a8c47e
Revert "feat: a typed interpreter contract and a registry that dispat…
patchmemory Aug 7, 2026
22470d9
fix: stop discarding interpreter-declared nodes before they reach the…
patchmemory Aug 7, 2026
2cc1818
fix: make the service-layer scan path persist interpretation too
patchmemory Aug 7, 2026
8a067a7
fix: align scanner interpreter ids with the registry, and stop over-r…
patchmemory Aug 7, 2026
4c7ee8b
fix: actually create INTERPRETED_AS edges on both commit paths
patchmemory Aug 7, 2026
adc3493
fix: give the Interpretation node a payload and an edge to its File
patchmemory Aug 7, 2026
5ad1f05
feat: carry interpreted_as onto the File node so the graph can be que…
patchmemory Aug 7, 2026
1bda5a2
refactor: one copy of the format-recognition tables
patchmemory Aug 7, 2026
3f67396
fix: route matched directory patterns to interpreted_as
patchmemory Aug 7, 2026
c0bf68d
fix: use composite File index and batch existence check in enrichment…
patchmemory Aug 7, 2026
de044b1
perf: index files for extension-only and path lookups (v26)
patchmemory Aug 7, 2026
4734e17
docs: note the imaging extra needed for whole-slide interpretation
patchmemory Aug 7, 2026
b95fe91
fix: move the files indexes out of migrations and into init_db
patchmemory Aug 7, 2026
32f079c
fix: add now() as a Jinja2 global for plugins template
patchmemory Aug 7, 2026
76b1e63
Add schema-aware Filter Builder — service, routes, JS component
patchmemory Aug 10, 2026
3554e87
Add Folder Attribution — service, routes, panel (anchor_label general…
patchmemory Aug 10, 2026
84b0e27
Generalize attribution: anchors, targets, graph-emergent relationships
patchmemory Aug 10, 2026
e413927
Attribution: anchor property filter, stale-anchor fix, vendored Tom S…
patchmemory Aug 11, 2026
57c3f33
Attribution: FilterBuilder target section, backend property filters
patchmemory Aug 11, 2026
6713ae7
Files page: split the monolith into a shell plus per-drawer modules
patchmemory Aug 18, 2026
e4c4eb7
Drives, scan history, interpret status, and Collection -> Dataset
patchmemory Aug 18, 2026
7f8b9fc
Walk the filesystem with os.scandir instead of rglob
patchmemory Aug 18, 2026
db36369
Persist background tasks, and estimate a scan total up front
patchmemory Aug 18, 2026
38ca6bb
docs: roadmap, the drives/history/collection diagnostic, FilterBuilde…
patchmemory Aug 18, 2026
0b457bc
chore: resolve merge conflicts, keep production-mvp as source of truth
patchmemory Aug 18, 2026
b03c303
chore: bump dev submodule to latest
patchmemory Aug 18, 2026
5af5bf7
Declare python-dotenv in pyproject, not just requirements.txt
patchmemory Aug 18, 2026
2057c17
Stop CI failing on tests that need services CI does not have
patchmemory Aug 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 96 additions & 0 deletions cleanup_usage_event_contamination.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
#!/usr/bin/env python3
"""One-time cleanup after the Cycle 1 Task B property-attribution fix.

Before the fix, ``extract_labels_and_properties`` attributed every property it
found to every label in the query, so

MATCH (p:Project)-[:PI_OF]-(u:Person) RETURN p.cac_protocol, u.email

logged cac_protocol and email against *both* Project and Person. Those rows are
in ``usage_event``, and ``flush_rankings()`` has already folded them into
``property_ranking``, which shapes the chat schema context.

This script deletes them so rankings rebuild cleanly from new queries.

Scope — deliberately narrower than a blanket ``DELETE FROM usage_event``:

* ``event_type = 'query_executed'`` rows are deleted. These are the only rows
the buggy parser produced.
* ``event_type = 'concept_graph_plan'`` rows are KEPT. They are written
directly by api_chat.py with ``label_name = ''`` and
``property_name = NULL``, carry the Concept Graph traversal log in
``traversal_json``, and never went through the buggy parser. A blanket
delete would throw them away for no benefit.
* ``property_ranking`` is truncated. ``flush_rankings()`` upserts and never
deletes, so a contaminated (label, property) pair would otherwise survive in
the table that feeds chat context even after its source rows are gone.

Idempotent — safe to run twice; the second run reports zero rows.

Usage:
python cleanup_usage_event_contamination.py [--db PATH] [--dry-run]

The database defaults to $SCIDK_SETTINGS_DB, then ./scidk_settings.db.
"""
import argparse
import os
import sqlite3
import sys


def main(argv=None) -> int:
parser = argparse.ArgumentParser(description=__doc__.splitlines()[0])
parser.add_argument(
'--db',
default=os.environ.get('SCIDK_SETTINGS_DB') or 'scidk_settings.db',
help='Path to scidk_settings.db (default: $SCIDK_SETTINGS_DB or ./scidk_settings.db)',
)
parser.add_argument(
'--dry-run', action='store_true',
help='Report what would be deleted without changing anything',
)
args = parser.parse_args(argv)

if not os.path.exists(args.db):
print(f"error: no such database: {args.db}", file=sys.stderr)
return 1

conn = sqlite3.connect(args.db)
try:
table = conn.execute(
"SELECT name FROM sqlite_master WHERE type='table' AND name='usage_event'"
).fetchone()
if not table:
print(f"{args.db}: no usage_event table — nothing to clean.")
return 0

contaminated = conn.execute(
"SELECT COUNT(*) FROM usage_event WHERE event_type = 'query_executed'"
).fetchone()[0]
kept = conn.execute(
"SELECT COUNT(*) FROM usage_event WHERE event_type <> 'query_executed'"
).fetchone()[0]
rankings = conn.execute(
"SELECT COUNT(*) FROM property_ranking"
).fetchone()[0]

print(f"{args.db}")
print(f" usage_event 'query_executed' rows to delete: {contaminated}")
print(f" usage_event other rows kept (traversal logs): {kept}")
print(f" property_ranking rows to clear: {rankings}")

if args.dry_run:
print(" (dry run — nothing changed)")
return 0

conn.execute("DELETE FROM usage_event WHERE event_type = 'query_executed'")
conn.execute("DELETE FROM property_ranking")
conn.commit()
print(" done — rankings will rebuild from new queries.")
return 0
finally:
conn.close()


if __name__ == '__main__':
raise SystemExit(main())
2 changes: 1 addition & 1 deletion dev
Submodule dev updated from 7e804f to 57bb0b
19 changes: 19 additions & 0 deletions docs/DEPLOYMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,25 @@ This guide covers production deployment of SciDK, including installation, config
pip install -e .[dev]
```

**Whole-slide imaging (`imaging` extra)** — a facility holding histology
data should install this:

```bash
pip install -e .[imaging]
```

It pulls in `tifffile`, which `svs_interpreter` uses to read the
`ImageDescription` tag of Aperio `.svs`, Hamamatsu `.ndpi` and Leica `.scn`
slides (metadata only — pixel data is never loaded). Omitting it is not a
breaking omission: the interpreter returns a stub with a
`tifffile not installed` warning and enrichment continues. But no
`HistologySlide` or `HistologySession` nodes will appear in the graph, and
the omission is only visible in the `warnings` list of an enrichment run,
so it is easy to mistake for "there is no histology data here".

Flow cytometry (`.fcs`) needs nothing extra — `fcs_interpreter` is stdlib
only.

4. **Initialize environment**:
```bash
# bash/zsh:
Expand Down
32 changes: 32 additions & 0 deletions docs/OPERATIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,38 @@ SciDK includes a backup scheduler. Configure in Settings → Backup:
- Set retention policy
- Configure backup location

> **Schedule changes need a restart under gunicorn.** All recurring jobs run in a
> single scheduler owned by the gunicorn master process (`--preload` in
> `restart_gunicorn.sh`), which is what stops every job firing once per worker.
> API requests are served by workers, so a schedule change is saved to
> `scidk_settings.db` but does not reach the live scheduler until the app
> restarts. A warning is logged when this happens — grep for "does not own the
> running scheduler".

### Scheduled Jobs

| Job id | Default schedule | Timezone |
|---|---|---|
| `daily_backup` | 02:00, configurable in Settings → Backup | system-local |
| `concept_graph_weight_decay` | 03:00 | system-local |
| `schema_intelligence_ranking_flush` | every 6h at :17 | UTC |

Environment overrides:

| Variable | Default | Effect |
|---|---|---|
| `SCIDK_RANKING_FLUSH_INTERVAL_HOURS` | `6` | Hours between property-ranking recomputes (1–24; out-of-range falls back to the default) |
| `SCIDK_CONCEPT_WEIGHT_HALFLIFE_DAYS` | `90` | Half-life for Concept Graph edge weight decay |
| `SCIDK_SCHEDULER_TIMEZONE` | `UTC` | Timezone for jobs that do not state their own |
| `SCIDK_DISABLE_SCHEDULER` | unset | Set to `1` to start no scheduler at all — for CLI commands and one-shot scripts that import the app factory |

To confirm one scheduler is running rather than sixteen, check that the job
registration line appears exactly once per restart:

```bash
grep "Scheduler running (pid=" gunicorn.log
```

**Manual SQLite backup**:
```bash
# Stop the application first (important!)
Expand Down
Loading
Loading