- Create RELEASE_NOTES.md with detailed per-contributor breakdown for all three release stages (0.3.0-alpha, 0.3.0-beta, 0.3.0 stable) including every PR, contributor, feature, bug fix, and test count - Replace verbose README 'What\'s New' section with a concise summary table linking to RELEASE_NOTES.md for full detail Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
16 KiB
Semantica v0.3.0 — Release Notes
Released: 2026-03-10
PyPI: pip install semantica
Tag: v0.3.0
Classification: Production/Stable
First stable, full public release of Semantica. Covers everything shipped across three release stages: 0.3.0-alpha (2026-02-19), 0.3.0-beta (2026-03-07), and 0.3.0 stable (2026-03-10).
Contributors
| Contributor | Role |
|---|---|
| @KaifAhmad1 | Lead maintainer — context graph, decision intelligence, KG algorithms, semantic extraction, pipeline, provenance, bug fixes, release management |
| @ZohaibHassan16 | Deduplication v2 suite (candidate generation, two-stage scoring, semantic dedup), incremental/delta processing, benchmark suite |
| @Sameer6305 | Apache AGE backend, PgVector store, Snowflake connector, Apache Arrow export |
| @tibisabau | ArangoDB AQL export, Apache Parquet export |
| @d4ndr4d3 | ResourceScheduler deadlock fix |
v0.3.0 — Stable (2026-03-10)
Context Graph Feature Completeness
Temporal Validity Windows (by @KaifAhmad1)
Nodes and edges now carry first-class valid_from / valid_until ISO datetime fields. These are stored directly on ContextNode and ContextEdge dataclasses — not in metadata — and survive full serialisation round-trips through save_to_file() / load_from_file() and to_dict() / from_dict().
ContextNode.is_active(at_time=None)andContextEdge.is_active(at_time=None)— returnsTrueif the node/edge is live at the given time (defaults to now). Handles both tz-aware and tz-naive datetime inputs correctly.ContextGraph.find_active_nodes(node_type=None, at_time=None)— filters the entire graph and returns only nodes within their validity window.add_node(valid_from=..., valid_until=...)andadd_edge(valid_from=..., valid_until=...)— pass validity fields directly in the call signature.- Bug fix:
is_active()previously crashed withTypeErrorwhen passed a tz-awaredatetime(e.g.datetime.now(timezone.utc)). Fixed by normalising all inputs to tz-naive UTC via a new_parse_iso_dt()helper. - Bug fix: validity fields were silently lost in
add_nodes(),add_edges(),to_dict(), andfrom_dict(). All four paths now correctly preserve and restore them.
Weighted Multi-Hop BFS (by @KaifAhmad1)
ContextGraph.get_neighbors(node_id, hops=1, relationship_types=None, min_weight=0.0) now accepts a min_weight threshold. Any edge with weight below the threshold is skipped during BFS traversal, allowing callers to confine multi-hop queries to high-confidence causal links. Default 0.0 is fully backward-compatible.
Cross-Graph Navigation (by @KaifAhmad1)
Separate ContextGraph instances can now be linked and navigated between — hierarchically, like separate knowledge domains that reference each other.
link_graph(other_graph, source_node_id, target_node_id, link_type="CROSS_GRAPH") -> str— creates a navigable bridge and returns alink_id. Records a dedicated"cross_graph_link"typed marker node internally (not a phantom"entity") and a marker edge.navigate_to(link_id) -> (other_graph, target_node_id)— jumps to the target graph and entry node for a given link.graph_idfield — eachContextGraphnow carries a stable UUID so instances can identify each other across save/load.save_to_file()— now writes alinkssection alongside nodes and edges, containinglink_id,source_node_id,target_node_id, andother_graph_idfor every cross-graph link.load_from_file()— restoresgraph_idand populates_unresolved_linksfrom thelinkssection.resolve_links(registry: Dict[str, ContextGraph]) -> int— reconnects unresolved links post-load. Pass{graph_id: graph_instance}for each linked graph; returns the count of successfully resolved links.navigate_to()raises a clearKeyErrorwith aresolve_links()hint if called before resolution.- Bug fix: the previous implementation auto-created the synthetic marker target as an
"entity"node (phantom pollution). Fixed by explicitly pre-creating a"cross_graph_link"typedContextNodebefore the marker edge. - 14 new tests in
tests/context/test_cross_graph_navigation.pycovering all scenarios including full save/load round-trips with partial registry resolution.
Other Fixes (by @KaifAhmad1)
PipelineBuilder.add_step()return type annotation corrected from"PipelineBuilder"to"PipelineStep"— the implementation was already correct; only the annotation and docstring were stale.test_hybrid_search_performancetiming computation fixed — now accumulates a truesearch_timeslist instead of reusing the last loop iteration'sstart_time; threshold relaxed to< 5.0sfor realsentence-transformers(384-dim) latency on development machines.
Test Coverage Added
- 14 cross-graph navigation tests (
tests/context/test_cross_graph_navigation.py) - Total: 335 context tests, 886+ tests across all modules — 0 failures
v0.3.0-beta — Beta (2026-03-07)
Semantic Extraction Fixes
Multi-Founder LLM Extraction & Reasoner Inference Fix (PR #354, by @KaifAhmad1)
_parse_relation_resultinmethods.py— unmatched subjects/objects now produce a syntheticUNKNOWNentity instead of silently dropping the relation. All co-founders returned by the LLM are preserved in the output.- Duplicate relation fix — an orphaned legacy block that appended every relation twice has been removed.
extraction_methodparameter added — typed extraction paths now correctly record"llm_typed"in relation metadata instead of"llm"._match_patterninreasoner.pyrewritten — splits patterns on?varplaceholders first, then escapes only literal segments. Pre-bound variables resolve to exact literals, repeated variables use backreferences, non-greedy.+?prevents over-consumption of separators.- Added
tests/reasoning/test_reasoner.py(4 tests) andtests/semantic_extract/test_relation_extractor.py(6 tests).
TTL Export Alias Fix (PR #355, by @KaifAhmad1)
RDFExporternow accepts"ttl","nt","xml","rdf", and"json-ld"as format aliases inexport_to_rdf(). Aliases resolve before format validation — zero public API changes.- Added
tests/export/test_rdf_exporter.py(8 tests).
Incremental / Delta Processing
Native Delta Computation (PR #349, by @ZohaibHassan16, reviewed and fixed by @KaifAhmad1)
- Native SPARQL-based diff between graph snapshots — only changed triples flow through the pipeline.
delta_modeconfiguration inPipelineBuilderfor near-real-time workloads.- Version snapshot management with graph URI tracking and metadata storage.
prune_versions()for automatic snapshot retention cleanup.- Bug fixes: corrected SPARQL variable order, fixed class references, resolved duplicate dictionary keys.
Deduplication v2
Candidate Generation v2 (PR #338, by @ZohaibHassan16)
- New opt-in strategies:
blocking_v2andhybrid_v2, replacing O(N²) pair enumeration. - Multi-key blocking with normalised token prefixes, type-aware keys, and optional phonetic (Soundex) blocking.
- Deterministic
max_candidates_per_entitybudgeting with stable sorting. - 63.6% faster in worst-case scenarios (0.259s → 0.094s for 100 entities).
Two-Stage Scoring Prefilter (PR #339, by @ZohaibHassan16)
- Fast gates for type mismatch, name-length ratio, and token overlap eliminate expensive semantic scoring for obvious non-matches.
- Configurable thresholds:
min_length_ratio,min_token_overlap_ratio,required_shared_token. - 18–25% faster batch processing with prefilter enabled (
prefilter_enabled=Falseby default).
Semantic Relationship Deduplication v2 (PR #340, by @ZohaibHassan16, fixes by @KaifAhmad1)
- Canonicalisation engine with predicate synonym mapping (
works_for→employed_by). - O(1) hash matching for exact canonical signatures.
- Weighted scoring: 60% predicate + 40% object composition with explainable
semantic_match_score. - 6.98x faster than legacy mode (83ms vs 579ms).
dedup_triplets()infinite recursion bug fixed; function is now a first-class API inmethods.py.
Deduplication v2 Migration Guide (PR #344, by @ZohaibHassan16, fixes by @KaifAhmad1)
- Comprehensive
MIGRATION_V2.mddocumenting all v2 strategies with code examples. - Full backward compatibility maintained — legacy mode remains the default.
Export Formats
ArangoDB AQL Export (PR #342, by @tibisabau)
- Full AQL INSERT statement generation for vertices and edges.
- Configurable collection names with validation and sanitisation; batch processing (default: 1000).
export_arango()convenience function;.aqlauto-detection in the unified exporter.- 17 tests, 100% pass rate.
Apache Parquet Export (PR #343, by @tibisabau)
- Columnar storage format with configurable compression: snappy, gzip, brotli, zstd, lz4, none.
- Explicit Apache Arrow schemas with type safety; field normalisation for varied naming conventions.
export_parquet()convenience function;.parquetauto-detection.- Analytics-ready for pandas, Spark, Snowflake, BigQuery, Databricks.
- 25 tests, 100% pass rate.
Bug Fixes & Test Suite Stabilisation
Test Suite Fixes (by @KaifAhmad1)
Context module:
retrieve_decision_precedents— gated entity extraction onuse_hybrid_search=Truecorrectly._extract_entities_from_query— now usesword[0].isupper()to capture camelCase identifiers likeCreditCard.- Added missing
expand_context(BFS traversal) and_get_decision_querymethods. - Fixed
hybrid_retrieval,dynamic_context_traversal, andmulti_hop_context_assemblyfor correct single-pass BFS. - Fixed
_retrieve_from_vectorfallback toresult["metadata"]["content"]to prevent empty content and negative re-ranking scores.
KG module:
calculate_pagerank— addedalpha/max_iteraliases; return format changed to{"centrality": scores, "rankings": sorted_list}.community_detector._to_networkx— now returns a NetworkX graph directly when one is passed (previously lost all edges).- Added 9 domain-specific tracking methods to
AlgorithmTrackerWithProvenance. - Created
provenance_tracker.pywithProvenanceTracker(track_entity,get_all_sources,clear).
Pipeline module:
- Retry loop fixed — now correctly iterates to
max_retries. RecoveryActiondataclass andhandle_failure(error, policy, retry_count)added with LINEAR, EXPONENTIAL, and FIXED strategies.add_step()fixed to return the createdPipelineStep.validateadded as alias forvalidate_pipelineinPipelineValidator.
Other:
- Fixed
NameErrorfor missingTypeimport inutils/helpers.py. - Vector store performance threshold relaxed (100ms → 500ms per decision for development machines).
- Windows cp1252 encoding fix in test files (emoji → ASCII).
ProvenanceTrackeradded tosemantica/kg/__init__.pyexports.
Results: ~840 tests passing, 36 skipped (external services), 0 failed
v0.3.0-alpha — Alpha (2026-02-19)
Context & Decision Intelligence
Context Engineering Enhancement (PR #307, by @KaifAhmad1)
The foundational 0.3.0 feature — complete overhaul of the context module for production-grade decision intelligence:
- Full decision lifecycle:
record_decision()→add_decision()→add_causal_relationship()→trace_decision_chain()→analyze_decision_impact()→analyze_decision_influence()→find_similar_decisions() AgentContextunified wrapper with granular feature flags:decision_tracking,kg_algorithms,graph_expansion; methods:store(),retrieve(),get_conversation_history(),get_statistics(),capture_cross_system_inputs()AgentMemorywith working, conversation, and long-term memory tiersPolicyEnginewith versioned policy nodes, compliance checking (check_decision_rules()), andPolicyExceptionmodel- Hybrid precedent search combining vector, structural, and category similarity with configurable weights
- Decision influence analysis via centrality measures and causal chain tracking
- GraphStore validation preventing runtime failures; secure logging
- 9 critical bug fixes across logging, security, audit trails, API compatibility, Cypher queries, centrality access, validation
Context Decision Tracking Fixes (PR #315, by @KaifAhmad1)
- Fixed empty/None decision ID handling in
add_decision() - Fixed None metadata handling preventing
TypeError - Fixed causal chain depth logic and node exclusion
- Fixed nonexistent node handling in
add_causal_relationship() - Fixed precedent search direction in
find_precedents() - Added missing
propertiesfield into_dict(); addedfrom_dict()method - Fixed UUID generation across all decision models
- All 71 context tests passing
Knowledge Graph Algorithms
Improved Graph Algorithms (PR #292, by @KaifAhmad1)
- 30+ graph algorithms across 7 categories
- Node embeddings: Node2Vec, DeepWalk, Word2Vec via
NodeEmbedder - Similarity: cosine, Euclidean, Manhattan, Correlation via
SimilarityCalculator - Path finding: Dijkstra, A*, BFS, K-shortest paths via
PathFinder - Link prediction: preferential attachment, Jaccard, Adamic-Adar via
LinkPredictor - Centrality: degree, betweenness, closeness, PageRank via
CentralityAnalyzer - Community detection: Louvain, Leiden, label propagation via
CommunityDetector - Connectivity: components, bridges, density via
ConnectivityAnalyzer GraphBuilderWithProvenanceandAlgorithmTrackerWithProvenancewith full execution metadata
Improved Vector Store for Decision Tracking (PR #293, by @KaifAhmad1)
DecisionEmbeddingPipelinewith semantic and structural embeddingsHybridSimilarityCalculatorwith configurable weights (semantic: 0.7, structural: 0.3)ContextRetrieverwith multi-hop reasoning- Convenience API:
quick_decision(),find_precedents(),explain(),similar_to(),batch_decisions(),filter_decisions() - 34+ tests; performance: 0.028s per decision, 0.031s search, ~0.8KB memory per decision
Graph Database Backends
Apache AGE Backend Security Fixes (PR #311, by @Sameer6305, fixes by @KaifAhmad1)
AgeStoreclass withGraphStoreAPI compatibility (openCypher via SQL on PostgreSQL)- SQL injection vulnerabilities fixed with input validation
- psycopg2-binary dependency and migration guide added
- Fixed parameter replacement and test mock leakage
PgVector Store Support (PR #303, by @Sameer6305, @KaifAhmad1)
- Native PostgreSQL vector storage using the pgvector extension
- Multiple distance metrics: cosine, L2/Euclidean, inner product
- HNSW and IVFFlat indexing for approximate nearest neighbour search
- JSONB metadata storage with flexible filtering; batch operations
- Connection pooling with psycopg3/psycopg2 fallback
- SQL injection protection via
psycopg_sql.SQL(); idempotent index and table management - 36+ tests with Docker integration
Infrastructure
ResourceScheduler Deadlock Fix (PR #299, #301, by @d4ndr4d3, @KaifAhmad1)
- Replaced
threading.Lock()withthreading.RLock()to fix nested lock acquisition deadlock inallocate_resources() - Added
ValidationErrorwhen no resources can be allocated - Progress tracking updates moved outside lock scope
- 6 regression tests for deadlock prevention
Security Configuration (by @KaifAhmad1)
- Dependabot bi-weekly security updates with manual review
- Automated security scans (Bandit, Safety, Semgrep) on schedule
- Security-critical package grouping; zero auto-merge policy
Summary by the Numbers
| Metric | Value |
|---|---|
| Total tests passing | 886+ |
| Test failures | 0 |
| Context tests | 335 |
| KG tests | ~430 |
| Semantic extraction tests | 70 (9 skipped — external LLM APIs) |
| Reasoning tests | 19 |
| Real-world scenario tests | 85 |
| PyPI classifier | Production/Stable |
| Python support | 3.8 – 3.12 |
Upgrade
pip install --upgrade semantica
No breaking changes. All new parameters have safe defaults and all new methods are additive.
See CHANGELOG.md for the full line-by-line diff.