Synthetic Semantic Document: Re-architecting E-Discovery Through Memory-Mapped Lakehouses and Dynamic Passage Retrieval The architecture of modern electronic discovery (e-discovery) and legal review platforms has historically been constrained by the physical and conceptual boundaries of the "document." Traditional review platforms force legal practitioners into a linear, repetitive, and cognitively exhausting workflow: open a file, read its contents, close the file, and proceed to the next isolated unit. This file-centric paradigm introduces immense cognitive friction, particularly when investigating complex legal or corporate narratives scattered across thousands of discrete emails, attachments, and memos.
The introduction of the Synthetic Semantic Document represents a profound epistemological shift in high-recall information retrieval. By treating the dataset not as a repository of files, but as a fluid lake of atomic, semantic chunks (paragraphs and sentences), the system dynamically generates a "glass pane" that instantly reorganizes fragmented data into a single, continuous narrative scroll.
The architectural blueprint of this system operates as a multi-layer schematic. At the far edge sits the raw Lakehouse, handling massive volumes of unstructured documents. Proceeding inward, LanceDB and semantic graph databases act as "The Finder," executing complex spatial and semantic filters. These systems pass an array of identifiers to "The Lens"—a series of lightweight DuckDB user interface tables—which perfects the alignment of the data chunks. Finally, "The Glass Pane," a sophisticated SwiftUI presentation layer, renders the continuous narrative with interactive annotations, providing a secure bypass via macOS BookmarkManager to the original files. This exhaustive report analyzes the theoretical, legal, and highly technical software architectures required to execute this paradigm, spanning from Continuous Active Learning theory to DuckDB memory management, Arrow C Data Interface zero-copy protocols, and SwiftUI deterministic rendering pipelines.
1. Theoretical Foundations of Passage-Level High-Recall Retrieval
The transition from traditional document-level review to passage-level chunk review is rooted in advanced High-Recall Retrieval (HRR) research, specifically the evolution of Technology-Assisted Review (TAR) and Continuous Active Learning (CAL).
1.1 The Inefficiencies of Document-Level Continuous Active Learning
The primary objective of HRR in e-discovery, medical systematic review, and regulatory investigations is to retrieve virtually all relevant documents pertaining to an information need while strictly minimizing the number of non-relevant documents returned. In high-stakes litigation, false negatives can be disastrous, whereas false positives are merely an inconvenience. TAR, introduced broadly into the legal sphere around 2011, revolutionized this process by keeping a human-in-the-loop to provide relevance feedback that continuously improves the underlying machine learning model—a process known as Continuous Active Learning (CAL).
The current state-of-the-art Baseline Model Implementation (BMI), famously utilized in the TREC Total Recall Tracks, trains a logistic regression model using BM25 and TF-IDF feature vectors, repeatedly presenting the reviewer with the next-most-likely relevant document. Iterative relevance feedback, often advertised as CAL, has repeatedly been shown to be more efficient in achieving plateau performance in one-phase workflows than uncertainty sampling or simple random sampling.
However, traditional CAL models operate on whole documents, which introduces significant friction. Research employing novel simulation frameworks has evaluated whether the time and effort necessary to achieve high recall is reduced by presenting reviewers with isolated sentences rather than full documents. Under the weak assumption that reviewing an entire document requires more time and effort than reviewing a single sentence, simulations indicate that sentence-level relevance feedback yields comparable accuracy and significantly higher efficiency relative to the standard AutoTAR BMI method. The Synthetic Semantic Document capitalizes on this insight. It extracts atomic chunks (paragraphs), strips away boilerplate data such as email signatures, routing headers, and confidentiality disclaimers, and stacks them vertically into a single scroll.
Furthermore, traditional lexical methods like BM25 struggle with long documents due to a phenomenon known as "signal dilution," where a single relevant sentence is drowned out by thousands of irrelevant tokens. Multi-topic narratives also produce misleading TF-IDF statistics, causing "topic drift". By breaking documents into semantic chunks and leveraging modern retrieval models like SPLADE, which transforms documents into contextualized sparse vectors, the Synthetic Semantic Document guarantees that the retrieval model—and the human reviewer—are evaluating dense, highly concentrated vectors of meaning.
| Evaluation Metric | Traditional TAR / BMI (Document Level) | Synthetic Semantic Document (Passage Level) |
|---|---|---|
| Review Unit | Full document (emails, attachments, memos) | Atomic chunk (paragraph, sentence) |
| Cognitive Load | High (parsing boilerplate, finding relevant text) | Low (only relevant text displayed) |
| Vector Concentration | Diluted (Signal dilution across thousands of tokens) | Highly Concentrated (Dense contextualized vectors) |
| Workflow Efficiency | Slower (open, read, close, iterate) | Continuous (infinite scrolling narrative) |
1.2 Legal Admissibility and Regulatory Compliance
While passage-level review drastically accelerates conceptual understanding, it introduces friction with traditional legal procedures that demand strict evidentiary provenance. Federal Rule of Civil Procedure (FRCP) Rule 34 dictates that electronically stored information must be produced in a form in which it is ordinarily maintained or in a reasonably usable form. This often requires the preservation of original document boundaries, native formatting, and metadata. The Synthetic Semantic Document natively addresses this tension via the "Source Jump" interaction, ensuring that while the attorney reads synthetic, disembodied chunks, the original, unadulterated file—complete with formatting, logos, and attachments—is instantly accessible for forensic verification.
Additionally, the redaction and logging of privileged information remain critical components of the e-discovery lifecycle. FRCP Rule 26(b)(5)(A) requires parties to expressly make claims of privilege and describe the nature of withheld documents in a manner that enables other parties to assess the claim without revealing the privileged information itself. The December 2025 amendments to Rules 26(f) and 16(b) have shifted privilege log planning to the very beginning of discovery, authorizing courts to mandate structured, enforceable privilege protocols and penalize late-stage logging failures. By retaining the hidden _internal_file_path and eca_docs metadata in a lightweight DuckDB table, the architecture seamlessly supports the generation of both categorical and metadata-only privilege logs, reducing the manual burden of traditional narrative logging.
Finally, the architecture must navigate stringent state-level privacy regulations, such as the Texas Data Privacy and Security Act (TDPSA). Enacted on July 1, 2024, with specific opt-out provisions taking effect in January 2025, the TDPSA mandates strict controls over "Sensitive Data". This includes precise geolocation, racial or ethnic origins, religious beliefs, mental or physical health diagnoses, and biometric data. The TDPSA requires robust data protection measures, including encryption and access controls, to prevent unauthorized disclosure, with civil penalties of up to $7,500 per violation enforced by the Texas Attorney General. The highly localized, offline-capable architecture of the Synthetic Semantic Document—relying on local DuckDB memory-mapped files and sandboxed bypasses via macOS APIs—aligns perfectly with requirements to keep highly sensitive PII localized and strictly governed, avoiding the vulnerabilities inherent in sprawling, multi-tenant cloud architectures.
2. Semantic Sequencing and Chronological Alignment
The illusion of the continuous Synthetic Document hinges entirely on the generation of "The Magic Key," internally referred to as the display_sort_id. Because the SwiftUI presentation layer requires deterministic, sequential data fetching to maintain rendering performance, the heavy computational lifting of sorting must be pre-calculated by the backend system (Catalyst) before the UI is ever rendered.
2.1 Chronological Sequencing
When a legal practitioner selects "Chronological Review," the Catalyst engine assigns a purely timeline-based identifier (e.g., 2001.10.24-001). This chronological sorting ensures that the scrolling narrative reads like a flawless, linear timeline of historical events. It pulls disjointed chunks from disparate emails, memos, and instant messages, stripping away the boundaries of the files they originated from, and renders them in the exact, to-the-second order they occurred. This allows an attorney to reconstruct a sequence of events across multiple custodians seamlessly.
2.2 Semantic Sequencing and HDBSCAN Clustering
However, the true analytical power of the platform lies in "Semantic Review." Here, Catalyst utilizes advanced machine learning algorithms—specifically HDBSCAN (Hierarchical Density-Based Spatial Clustering of Applications with Noise)—to group mathematically identical or highly related concepts together, regardless of their chronological timestamp or original custodian.
HDBSCAN operates by building a hierarchy of clusters based on a mutual reachability distance metric. Unlike traditional K-Means, HDBSCAN does not require the user to pre-define the number of clusters and is highly resilient to noisy, sparse data, which is typical in e-discovery corpora. The algorithm constructs a minimum spanning tree and iteratively removes edges to form a cluster hierarchy, eventually simplifying this into a "condensed tree".
To create a linear, one-dimensional scrolling experience from a multi-dimensional semantic cluster graph, the system relies on HDBSCAN's persistence scores and cluster sequencing mechanisms. Nodes within a cluster are assigned lambda values proportional to the degree they persist as part of the cluster structure. The algorithm iteratively traverses the condensed tree, extracting leaves and ordering them based on density and edge weights to flatten the high-dimensional semantic relationships into a sequential string array (e.g., C045.00192). By setting the display_sort_id to this flattened cluster value, the system guarantees that an attorney can scroll continuously through 50 isolated paragraphs discussing a specific "hidden debt" mechanism or "Raptor SPV," completely uninterrupted by chronological noise or irrelevant conversational tangents.
3. The Data Contract: DuckDB as the Analytical Lens
The Synthetic Document UI is deliberately blind to the heavy, backend Lakehouse infrastructure. It relies entirely on lightweight DuckDB tables materialized by Catalyst into a specific local directory (10_vantage_ui/eca/). This directory contains two fundamental tables: eca_chunks representing the text payload, and eca_docs representing the parent metadata.
3.1 DuckDB Architecture and In-Process Analytics
DuckDB is an in-process, analytical SQL database management system utilizing a columnar data model optimized for complex, read-heavy analytical queries. By holding the logical query pattern constant and varying the dataset size in rigorous benchmarks, data scientists have demonstrated that DuckDB inherently prioritizes memory efficiency over aggressive memory-mapped I/O scaling, making it exceptionally safe for memory-constrained client environments.
Because DuckDB natively understands and memory-maps the Parquet format, the SwiftUI application never loads the entire dataset into RAM. DuckDB reads data and processes it one chunk at a time via a sophisticated streaming execution engine. To achieve the 60 frames-per-second (fps) scrolling promised by the SwiftUI frontend, the architecture relies heavily on DuckDB's ability to operate efficiently under strict resource constraints without triggering operating system interventions.
3.2 Threading, Memory Limits, and Out-of-Core Processing
To properly tune DuckDB for real-time UI rendering alongside a Swift frontend, specific environmental parameters must be actively managed by the developers. DuckDB parallelizes workloads based on row groups, which default to 122,880 rows in its native database format. While multi-core parallelism is generally advantageous, DuckDB may inadvertently launch too many threads (for example, due to hardware HyperThreading), leading to context-switching slowdowns that degrade performance. It is highly recommended to explicitly constrain the thread count using the SET threads = X; configuration to prevent the database engine from monopolizing the CPU and starving the main UI rendering thread.
Similarly, memory governance is paramount. While DuckDB operates efficiently with a recommended 1 to 4 GB of memory per thread, its memory consumption can exceed defined limits. This occurs because certain in-memory data structures—such as vectors, query results, and complex aggregate function states (e.g., list, string_agg)—are allocated outside of the primary buffer manager. Counter-intuitively, reducing the stated memory limit below the default 80% of physical RAM down to 50-60% via the SET memory_limit = '...'; command can prevent Operating System Out-of-Memory (OOM) reapers from silently terminating the application during heavy semantic filtering tasks.
When workloads exceed available memory, DuckDB seamlessly spills intermediate data to disk via out-of-core processing. These intermediate data structures are written to a temporary directory (temp_directory), ensuring the query completes, albeit with additional I/O latency. For a real-time UI application, spilling to disk during a simple scroll event would instantly break the 60fps frame rate. Therefore, the pre-calculation of the display_sort_id is critical; it ensures that the UI layer only executes lightweight index scans rather than on-the-fly, larger-than-memory sorting operations. When rapid ingestion or export of massive CSV/Parquet files is necessary, setting the preserve_insertion_order configuration to false allows the engine to re-order results without ORDER BY clauses, drastically reducing memory overhead.
va_synthetic_docs.parquet using recursive closure CTEs, bounding contiguous chunk ranges via [sort_key_min, sort_key_max] for zero-join streaming.
-- Pre-compute cluster chunk bounds & metadata via recursive tree closure
WITH RECURSIVE
closure(ancestor_id, node_id, hops) AS (
SELECT node_id, node_id, 0 FROM hierarchy
UNION ALL
SELECT h.parent_id, closure.node_id, closure.hops + 1
FROM closure JOIN hierarchy h ON h.node_id = closure.ancestor_id
WHERE h.parent_id >= 0
),
rolled_stats AS (
SELECT
cl.ancestor_id AS celestial_node_id,
COUNT(*) AS chunk_count,
MIN(s.sort_key) AS sort_key_min,
MAX(s.sort_key) AS sort_key_max
FROM closure cl
JOIN chunk_stats s ON s.node_id = cl.node_id
GROUP BY cl.ancestor_id
)
-- Client UI streams contiguous chunks: WHERE chunk_semantic_sort_id BETWEEN min AND max
| Configuration Parameter | Default Value | Recommended Override for UI | Justification |
|---|---|---|---|
| threads | All available cores | SET threads = 4; | Prevents CPU starvation for the main Swift UI rendering thread. |
| memory_limit | 80% of system RAM | SET memory_limit = '4GB'; | Prevents OS OOM reapers from killing the app due to allocations outside the buffer manager. |
| preserve_insertion_order | true | false | Reduces memory pressure during large table materializations if explicit ordering is unnecessary. |
| temp_directory | .tmp (in-memory) | Explicit fast SSD path | Ensures that if out-of-core disk spilling occurs, it leverages high-throughput NVMe storage. |
3.3 C API Integration and Memory Leaks
To bridge the analytical power of DuckDB to the SwiftUI layer, the system relies on the DuckDB C API and its corresponding Swift bindings. The duckdb_query method allows standard SQL queries to be executed, storing the materialized result in a duckdb_result pointer. For optimal performance in a real-time UI context, developers must bypass the deprecated duckdb_value functions, which perform safe but slow internal bounds-checking and type-casting. Instead, the architecture utilizes duckdb_fetch_chunk, which directly hands over raw data chunks in DuckDB's native array format for maximum throughput.
Crucially, memory management across the C/Swift interop boundary is unforgiving. All connections must be explicitly disconnected utilizing duckdb_disconnect, and after running duckdb_query, the duckdb_destroy_result function must be called on the result object—even if the underlying query fails. Failure to invoke duckdb_destroy_result or duckdb_destroy_prepare correctly is a highly documented source of catastrophic memory leaks in DuckDB API integrations, causing application memory to spike incrementally until eventual crash.
4. The Presentation Layer: Mastering SwiftUI Deterministic Rendering
The rendering engine of the Synthetic Semantic Document relies entirely on SwiftUI's LazyVStack. Unlike a standard VStack that instantiates all child views immediately—which would cause massive memory bloat and immediate application failure when attempting to render 50,000 document chunks—a LazyVStack defers view creation, only instantiating subviews as they approach the visible screen boundary.
4.1 Deterministic Rendering and Frame Drops
Achieving a continuous 60 frames per second (fps) scroll while dynamically querying DuckDB requires strict adherence to SwiftUI performance paradigms. Stuttering inside a LazyVStack occurs when the on-demand creation of views exceeds the ~16.6ms budget per frame (or ~8ms for 120Hz ProMotion displays).
The primary cause of stuttering with variable-height text chunks is layout measurement recalculation. A LazyVStack estimates its total off-screen height by averaging the size of already placed views and multiplying by the remaining subview count. If chunk sizes vary wildly, or if the view contains complex, dynamic view modifiers, SwiftUI must constantly invoke sizeThatFits during the active scroll event, causing the scrollbar to jump erratically and the framerate to drop.
To optimize this rendering pipeline, developers must enforce stable identifiers and pre-calculation strategies:
Stable Identifiers: The ForEach loop populating the LazyVStack must rely on a stable, unique id (in this case, the display_sort_id). If the identifier shifts dynamically, SwiftUI unnecessarily destroys and recreates the view body, thrashing the CPU.
Equatable Conformance: Implementing Equatable on the chunk view struct allows SwiftUI to bypass expensive reflection comparisons. This instructs the UI engine to explicitly determine if a re-render is necessary based on data mutation, significantly reducing CPU load during fast scrolling.
Avoiding onAppear for Heavy Tasks: Executing complex logic, network requests, or heavy database queries within the onAppear modifier blocks the main thread at the exact moment the view is attempting to render the frame. Data fetching must be pre-batched and executed asynchronously off the main thread.
Above the core text payload, Swift performs a microsecond JOIN to the eca_docs table to print the parent document's metadata (Date, Sender, Subject). This gives the attorney immediate context of where the paragraph originated, effectively mimicking the informational density of reading a traditional PDF while maintaining the speed of a single scroll view.
4.2 Swift Concurrency, Sendable, and Task Memory Leaks
Because SwiftUI asynchronously asks DuckDB for the next 20 chunks on the fly as the user scrolls, thread safety and memory management within Swift's modern concurrency model are paramount. The Sendable protocol is Swift's strict compile-time safety mechanism designed to prevent data races when passing values between different concurrency contexts (e.g., from a background data fetching task to the main UI thread).
When transferring data across actor boundaries, all models must conform to Sendable. This is typically achieved by utilizing immutable value types (like structs) or marking classes as final with strictly immutable properties. This architectural requirement guarantees thread safety natively via the compiler without relying on expensive, manual locking mechanisms (like queues or semaphores) that could introduce unpredictable latency.
Furthermore, infinite scrolling implementations that rely heavily on Swift's async/await and Task structures are highly susceptible to memory leaks via retain cycles. When Task {} blocks are used to fetch data, they strongly capture self by default. If an attorney scrolls rapidly, causing a view to scroll off-screen and be destroyed by the LazyVStack, but the background async fetch task remains running, the memory is never freed, creating a classic retain cycle.
This is mitigated by explicitly binding asynchronous tasks to the view's lifecycle using the .task modifier (which automatically cancels the operation when the view disappears). If using unstructured concurrency, developers must actively monitor Task.isCancelled within custom asynchronous sequences, or use weak captures (e.g., [weak self]) to ensure the task naturally terminates and drops its closure when the parent component is deallocated.
4.3 Programmatic Scrolling and ScrollPosition Stability
When transitioning between deep review contexts (e.g., jumping from a chronologically sorted view to a semantically clustered view), the scrollbar must maintain absolute stability. iOS 17 and macOS 14 introduced the scrollPosition(id:anchor:) modifier, allowing programmatic scrolling to a specific view identity.
When utilizing this API, SwiftUI attempts to keep the view with the specified identity visible when events occur that might cause it to be scrolled out of bounds, such as underlying data re-ordering or window resizing. By continuously binding the ScrollPosition to the current display_sort_id, the Synthetic Document ensures that the attorney's exact reading location is preserved organically, even as new chunks are fetched and rendered dynamically from the DuckDB backend.
5. Multi-Modal Interactions and Workflow Accelerators
When reading the Synthetic Document, the attorney is not a passive consumer of text. They command three distinct, highly optimized interactions that dynamically alter the underlying database queries without breaking the immersive reading state.
A. The Context Halo (The Spacebar) The Problem: An attorney is reading a filtered, semantic chunk that says, "Execute the transfer now." While highly relevant, the attorney desperately needs to know what the preceding and succeeding paragraphs of that specific email stated to accurately determine intent. The Action: The attorney hits the Spacebar while focused on the chunk. The Execution: Swift instantly executes an asynchronous query against DuckDB: "Give me the chunks with the same doc_id where chunk_index is -1 and +1." The Insight: Because DuckDB memory-maps the Parquet files and utilizes optimistic concurrency control, this read-only query is executed in microseconds without locking the database or the main UI thread. The adjacent paragraphs smoothly animate into the SwiftUI hierarchy, expanding the narrative footprint and providing localized context without breaking the attorney's continuous scroll flow.
B. The Source Jump (Double Click) The Problem: To formally verify authenticity or view complex formatting (e.g., a heavily formatted Excel table or PDF logo), the attorney needs to see the original, unadulterated file. The Action: The attorney double-clicks the chunk card. The Execution: Swift extracts the hidden _internal_file_path from the eca_docs metadata table. It then leverages macOS BookmarkManager to securely bypass the App Sandbox, handing the raw .eml or .pdf file directly to macOS QuickLook. The Insight: This interaction elegantly bridges the gap between modern semantic chunking and rigid FRCP Rule 34 compliance. The database effectively abstracts away the heavy file system for rapid review, but retains a cryptographically secure, sandboxed pathway back to the native evidentiary file when deep, forensic verification is legally required.
C. The Visual Filter (The Lasso) The Problem: The Synthetic Document is currently showing 50,000 semantic chunks, and the attorney needs to isolate a highly specific sub-topic. The Action: The attorney lassos a specific cluster of nodes on the Visual Semantic Graph interface, or types a precise semantic query (e.g., "hidden debt") into the search bar. The Execution: The vector database (LanceDB) executes a similarity search and returns an array of 400 highly relevant chunk_ids to Swift. Swift instantly intercepts this array and mutates the active DuckDB query, appending WHERE chunk_id IN (...). The 50,000 chunks vanish, and the UI snaps to a perfectly sorted, continuous document of the 400 targeted paragraphs. The Insight: This interaction highlights the immense power of the zero-copy data integration between LanceDB (built on Arrow) and DuckDB. Apache Arrow provides an in-memory columnar data format that both databases speak natively. Utilizing the Arrow C Data Interface—which requires a mere 29 lines of C code to define array and schema structures—DuckDB can query the vector search results directly without serializing or deserializing the data.
However, a critical performance nuance exists in this handoff. While DuckDB features advanced optimizers that can push down filters and projections directly into Arrow scans to accelerate execution, DuckDB's Arrow integration has historically exhibited limitations regarding filter pushdowns for complex, multi-key lookups. If LanceDB passes an array of 400 independent chunk_ids, pushing that complex filter down across the Arrow interface can create a latency bottleneck. To maintain immediate UI snapping, the architecture registers the Arrow table directly in DuckDB's memory space (zero-copy registration) and utilizes DuckDB's internal vectorized execution engine to execute the IN (...) join, bypassing the external Arrow scanner filter limitations entirely to achieve sub-second responsiveness.
Conclusion The Synthetic Semantic Document fundamentally re-architects the mental model of electronic discovery. It successfully transforms a tedious, file-centric indexing task into a fluid, highly concentrated narrative reading experience.
The division of labor within the architecture is absolute: the sidecar and LanceDB act as "The Finder," executing complex spatial and vector math to locate the conceptual needles in a massive data haystack. DuckDB and the lightweight UI tables act as "The Lens," taking those needles, aligning them perfectly via the display_sort_id, and exposing them to the presentation layer. Finally, SwiftUI acts as "The Glass Pane," rendering a 60fps interactive document that responds intuitively to user commands.
This system solves the inherent cognitive and computational limitations of traditional document-level review by surfacing atomic, semantic concepts, while remaining strictly compliant with emerging privacy mandates like the TDPSA and foundational evidentiary rules like the FRCP. Ultimately, executing this architecture requires profound discipline in systems engineering—navigating the treacherous waters of SwiftUI rendering budgets, Swift Concurrency thread safety, and C-API memory management—to deliver the ultimate illusion of simplicity: a single, infinite pane of glass into the absolute truth of the dataset.
Cite This Architectural Specification
To reference this specification or cite its architectural and mathematical findings in academic literature, legal filings under FRE 702, or technical research, please use the following bibliographic references:
Epistemon, & Deep Thought Labs. (2026). Synthetic Semantic Document: Re-architecting E-Discovery via Autonomous Semantic Reconstruction: Multi-Modal Forensic Synthesis, Thread Reconstruction, and Contextual Enrichment of Fragmented Evidence. Deep Thought Labs Architectural White Paper Series. https://deepthoughtlabs.ai/papers/synthetic-semantic-document/
Epistemon, and Deep Thought Labs. “Synthetic Semantic Document: Re-architecting E-Discovery via Autonomous Semantic Reconstruction: Multi-Modal Forensic Synthesis, Thread Reconstruction, and Contextual Enrichment of Fragmented Evidence.” Deep Thought Labs Architectural White Paper Series, October 2026. https://deepthoughtlabs.ai/papers/synthetic-semantic-document/.
@techreport{deepthought2026syntheticsemanticdoc,
author = {Epistemon and {Deep Thought Labs}},
title = {{Synthetic Semantic Document: Re-architecting E-Discovery via Autonomous Semantic Reconstruction: Multi-Modal Forensic Synthesis, Thread Reconstruction, and Contextual Enrichment of Fragmented Evidence}},
institution = {Deep Thought Labs},
type = {Architectural White Paper},
series = {Sublate Catalyst Technical Reports},
year = {2026},
month = {10},
url = {https://deepthoughtlabs.ai/papers/synthetic-semantic-document/},
note = {Permanent canonical archive}
}