Commit History

  1. Wire get_graph_depth() into 5 internal investigator queries (R-5, partial)⁠

    f064888
  2. Wire get_cache_ttl() into _STATS_TTL and _VERIFY_TTL (R-5, partial)⁠

    dd8fe80

  1. Extend provenance badges to search results (D8)⁠

    c91bada
  2. Add provenance badges to the entity profile view (D8)⁠

    66bf6f4
  3. Migrate admin-secret generation to try the OS keychain first (D6)⁠

    188acc4

  1. fix: desktop-mode-adapt dossier output; unify 3 hardcoded copies of its path (P-1)⁠

    7650d33
  2. fix: centralize + desktop-mode-adapt the logs directory (P-1)⁠

    6d12c24

  1. feat(D1): local config-file loading + desktop-mode admin-auth hardening⁠

    e26a730

  1. cleanup(input_validator): remove dead ALLOWED_CHARS regex⁠

    04bce6d
  2. fix: version-string drift (F-8) and dead ALLOWED_CHARS regex (F-9)⁠

    a520836

  1. fix(timeline route): invalid Cypher syntax '{id: }' and bare LIMIT⁠

    4ccfced
  2. fix(forensics route): invalid Cypher syntax '{id:}' in 3 query blocks⁠

    3f1a145
  3. fix(risk route): invalid Cypher syntax + wrong field names in 3 Phase-34 blocks⁠

    146a572

  1. fix(search): remove dead 'pressrelease' LABEL_QUERIES branch⁠

    7fd981e

  1. chore: bump version to 0.36.0 -- Phase 35 complete⁠

    8549189

  1. chore: bump version to 0.35.0 -- Phase 34 complete⁠

    820c26f
  2. feat(phase-34): register forensics, self_learning, case_memory routers⁠

    70e41ad
  3. feat(phase-34): add api/routes/case_memory.py with 3 endpoints⁠

    538036c
  4. feat(phase-34): add api/routes/self_learning.py with 4 endpoints⁠

    5fdaa50
  5. feat(phase-34): add api/routes/forensics.py with 5 endpoints⁠

    48337b7
  6. feat(phase-34): wire BenfordsAnalyzer + GhostCompanyDetector + ShadowDirectorDetector into risk scorer⁠

    4ac80cb

  1. chore: bump version to 0.34.0 -- Phase 33 complete⁠

    1b77cde
  2. feat(phase-33): register timeline.router in api/main.py⁠

    5457f68
  3. feat(phase-33): add api/routes/timeline.py with 2 endpoints⁠

    4435778
  4. feat(phase-33): add 4 graph analytics endpoints to api/routes/graph.py⁠

    5ac9ba3

  1. chore: bump version to 0.33.0 -- Phase 32 complete⁠

    681bc37
  2. feat(phase-32): load AliasGraph at startup + register resolve.router⁠

    02e886f
  3. feat(phase-32): add AliasGraph import and singleton to api/main.py⁠

    d0cb2c0

  1. feat(phase-32): register resolve.router in api/main.py⁠

    e36916d
  2. feat(phase-32): add api/routes/resolve.py with 4 endpoints⁠

    d5dc03e

  1. fix(M-09): confirm dirname guard in save_json; bump version to 0.32.0⁠

    e492711

  1. fix(NEW-3): expand _FEED_LABELS from 6 to 14 node types⁠

    1a8094a
  2. fix(B-01): define _stats_lock -- NameError crashed GET /stats on every call⁠

    05ed738

  1. fix(BACKEND-2): add threading.Lock for _stats_cache -- prevents concurrent full-graph scans

    112882a

  1. chore: bump version to 0.31.5 -- Sprint 7 complete (31 commits, 30+ bugs fixed)

    fc19538
  2. fix(SEARCH-2,SEARCH-3): add datagov/crimereport filter buttons; add Arabic script U+0600-U+06FF to ALLOWED_CHARS for Urdu/Sindhi search

    297cc9e
  3. fix(SEARCH-1): call setup_schema() in API lifespan startup -- fulltext index created on fresh deployment without waiting for daily scrape

    aa36a1a
  4. fix(BACKEND-1): move rate limiter eviction AFTER current key pruning -- prevents losing rate-limit tracking on burst-after-idle patterns

    9d85e1e
  5. fix(LOGIC-1): remove 2 duplicate pressrelease keys in LABEL_QUERIES; fix LIMIT $lim -> $limit to match query runner kwarg

    b348d13
  6. fix(SEC-6): reject empty-string ADMIN_SECRET -- empty string was falsy and bypassed authentication check

    4040e0f
  7. fix(CodeQL#16-17): use validated real_out path for FileResponse and media_type check in export.py

    673a953
  8. fix(CodeQL#23): log exception type only in investigation.py -- full exception message may expose Neo4j URI

    7a6c1ee
  9. fix(FEED-3): replace deprecated asyncio.get_event_loop() with get_running_loop() in WebSocket handler

    c157cb6

  1. fix(SyntaxError): remove duplicate stats cache block in api/main.py -- global must precede all use of variable

    b20b3a7

  1. fix(H-07): add 60s cache for /stats endpoint -- prevents full MATCH(n) scan on every homepage load

    5ead1fe
  2. fix(M-08): add pressrelease alias in LABEL_QUERIES so frontend filter button works

    9b088fe

  1. chore: bump version to 0.31.4 -- Sprint 5 complete (36 bugs fixed across 36 commits)

    1e8b330
  2. fix(H-07): add 60s cache to /stats endpoint -- prevents full graph scan (MATCH (n)) on every homepage load

    903be0d
  3. fix(M-08): add 'pressrelease' alias key in LABEL_QUERIES -- frontend filter button now correctly filters to PressRelease nodes

    2d87a38
  4. fix(M-03,M-06,M-08): add mobile CSS overrides for inline grid layouts; add NONE risk level for score=0; clamp risk score to 0-100

    b0e0450