{"templateId":"markdown","sharedDataIds":{},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Email Response: Osmosis + Papr Integration Analysis","siteUrl":"https://platform.papr.ai","description":"Papr Memory is an AI-native memory layer that lets developers add production-ready memory to their AI agents and apps with just a few lines of code."},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"email-response-osmosis--papr-integration-analysis"},"children":["Email Response: Osmosis + Papr Integration Analysis"]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"to-osmosis-developer"},"children":["To: Osmosis Developer"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Thanks for the detailed questions! I've done a deep analysis of how Papr aligns with your Osmosis requirements. Here's what I found:"]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":""},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["TL;DR: Yes, Papr can be your foundation layer"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What Papr handles automatically:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["✅ Knowledge graph storage with custom schemas"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["✅ ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Deduplication"]}," (same claim from 3 docs → 1 node with 3 sources)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["✅ ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Multi-source tracking"]}," (EXTRACTED_FROM relationships)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["✅ ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Source counting"]}," (GraphQL traverses relationships)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["✅ Provenance tracking (every claim → source)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["✅ Hybrid retrieval (semantic + keyword + graph)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["✅ Property injection (version, authority, dates)"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What you'd build on top:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Resolution rules (count > 3? freshness? authority?)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Inference engine (transitive rules, logical derivation)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Optional: Workflow tracking (ConflictSet nodes, review status)"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Bottom line:"]}," Papr gives you 90% of the infrastructure. The epistemological governance layer is custom logic you'd build regardless of underlying database."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"your-5-questions---direct-answers"},"children":["Your 5 Questions - Direct Answers"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"1."},"children":["1. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Conflicting Statements"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Papr provides automatically:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Deduplication via unique_identifiers"]},": Same (subject, predicate, object) → ONE node"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Multi-source tracking"]},": Multiple EXTRACTED_FROM relationships per claim"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Built-in source counting"]},": GraphQL returns all sources per claim"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Example:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Define deduplication in schema\nschema = {\n    \"Claim\": {\n        \"properties\": {\"subject\": \"...\", \"predicate\": \"...\", \"object\": \"...\"},\n        \"unique_identifiers\": [\"subject\", \"predicate\", \"object\"]  # Dedup key\n    }\n}\n\n# Upload 3 documents saying \"Product X costs $100\"\n# → Papr creates ONE Claim node with 3 EXTRACTED_FROM relationships\n\n# Upload 1 document saying \"Product X costs $150\"  \n# → Papr creates DIFFERENT Claim node (different object value)\n\n# Query for conflicts (built into GraphQL)\nquery = \"\"\"\nquery FindConflicts($subject: String!) {\n  claims(where: { subject: $subject }) {\n    object  # The value\n    sources { document_id, version, date }  # Auto-counted!\n  }\n}\n\"\"\"\n\n# Returns:\n# Claim 1: object=\"$100\", sources=[doc1, doc2, doc3] (3 sources)\n# Claim 2: object=\"$150\", sources=[doc4] (1 source)\n# → CONFLICT: same subject, different objects\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["You decide resolution:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Count-based: \"Pick claim with most sources\" (3 > 1)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Freshness: \"Pick most recent document\""]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Authority: \"Pick official source over unofficial\""]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Combined: \"Most sources from official docs\""]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"2."},"children":["2. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Contextual Metadata vs. Claims"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Papr provides two mechanisms:"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["1. Memory metadata"]}," (contextual info about source):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"client.memory.add(\n    content=\"API rate limit is 1000/hour\",\n    metadata={\n        \"version\": \"v2.0\",\n        \"authority\": \"official\",\n        \"document_section\": \"rate-limits\"\n    }\n)\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["2. Property overrides"]}," (forced onto extracted nodes):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"client.memory.add(\n    content=\"API rate limit is 1000/hour\",\n    memory_policy={\n        \"mode\": \"auto\",  # LLM extracts claim\n        \"node_constraints\": [{\n            \"node_type\": \"Claim\",\n            \"set\": {\n                \"version\": \"v2.0\",  # Injected metadata\n                \"authority\": \"official\",  # Injected metadata\n                # LLM extracts: subject, predicate, object\n            }\n        }]\n    }\n)\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Answer:"]}," Full control. Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["memory.metadata"]}," for context, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["node_constraints.set"]}," to inject properties onto nodes, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["mode: auto"]}," for extracted claims."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"3."},"children":["3. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Versioned Knowledge / Temporal Evolution"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Papr provides:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Timestamps on all memories (automatic)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Property overrides to inject version info"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Two approaches:"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Option 1: Version as property"]}," (simpler):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"client.memory.add(\n    content=\"API v1.0 rate limit is 100/hour\",\n    memory_policy={\n        \"mode\": \"auto\",\n        \"node_constraints\": [{\n            \"node_type\": \"Claim\",\n            \"set\": {\n                \"version\": \"v1.0\",\n                \"effective_from\": \"2024-01-01\",\n                \"effective_until\": \"2025-06-01\"\n            }\n        }]\n    }\n)\n\n# Query by version\nquery = \"claims(where: { subject: '...', version: 'v1.0' })\"\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Option 2: Separate version nodes"]}," (more structured):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Create explicit KnowledgeVersion nodes\n# Link via SUPERSEDES relationships\n# Query version chains\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Answer:"]}," Inject version via property overrides, OR create separate version nodes. Point-in-time queries via GraphQL filters."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"4."},"children":["4. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Source Evidence vs. Inferred Relationships"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Papr provides:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Two modes:",{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Auto mode"]},": LLM extracts relationships from content (tied to source memory)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Manual mode"]},": You specify exact graph structure"]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["All extracted relationships link back to source"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["You build:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Inference engine queries existing relationships"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Creates new relationships with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["inferred: true"]}," flag"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Tracks inference rules (transitive, contradiction, etc.)"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Example:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Papr extracts: A --RELATED_TO--> B, B --RELATED_TO--> C\n# Your inference engine creates: A --RELATED_TO--> C\n# With properties: {inferred: true, rule: \"transitive\"}\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Answer:"]}," Relationships are primarily extracted, not inferred. You can build inference layer using GraphQL + manual relationship creation."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"5."},"children":["5. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Single-Source vs. Multi-Source Corroboration"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Papr provides automatically:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Deduplication merges same claim from multiple sources → ONE node"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Multiple EXTRACTED_FROM relationships (one per source)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["GraphQL traverses relationships and counts sources"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Simple query:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"query = \"\"\"\nquery GetCorroboration($subject: String!) {\n  claims(where: { subject: $subject }) {\n    object\n    sources {  # Papr populates this automatically\n      document_id\n      authority\n    }\n  }\n}\n\"\"\"\n\nresult = await client.graphql.query(query, {\"subject\": \"rate limit\"})\n\nfor claim in result['data']['claims']:\n    source_count = len(claim['sources'])\n    official_count = sum(1 for s in claim['sources'] if s['authority'] == 'official')\n    \n    # Apply your resolution rule\n    if source_count >= 3 and official_count >= 2:\n        # High confidence\n    elif source_count == 1:\n        # Single source - needs review\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Answer:"]}," Counting sources is a simple GraphQL query. Papr's deduplication handles multi-source tracking. You just decide the scoring formula (count? weighted? freshness?)."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"concrete-schema-example-for-osmosis"},"children":["Concrete Schema Example for Osmosis"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"from papr_memory import Papr\n\nclient = Papr(x_api_key=\"...\")\n\n# Your Osmosis schema\nschema = client.schemas.create(\n    name=\"Osmosis Claims Schema\",\n    node_types={\n        \"Claim\": {\n            \"properties\": {\n                \"statement\": {\"type\": \"string\", \"required\": True},\n                \"subject\": {\"type\": \"string\"},\n                \"predicate\": {\"type\": \"string\"},\n                \"object\": {\"type\": \"string\"},\n                \"confidence\": {\"type\": \"float\"},\n                \"source_count\": {\"type\": \"integer\"},\n                \"corroboration_score\": {\"type\": \"float\"},\n                \"version\": {\"type\": \"string\"}\n            }\n        },\n        \"Source\": {\n            \"properties\": {\n                \"document_id\": {\"type\": \"string\", \"required\": True},\n                \"version\": {\"type\": \"string\"},\n                \"page\": {\"type\": \"integer\"},\n                \"authority\": {\"type\": \"string\", \"enum_values\": [\"official\", \"unofficial\"]},\n                \"publication_date\": {\"type\": \"datetime\"}\n            }\n        },\n        \"ConflictSet\": {\n            \"properties\": {\n                \"subject\": {\"type\": \"string\"},\n                \"predicate\": {\"type\": \"string\"},\n                \"resolution_status\": {\"type\": \"string\", \"enum_values\": [\"unresolved\", \"resolved\", \"ignored\"]},\n                \"resolution_rule\": {\"type\": \"string\"}\n            }\n        },\n        \"KnowledgeVersion\": {\n            \"properties\": {\n                \"version\": {\"type\": \"string\"},\n                \"effective_from\": {\"type\": \"datetime\"},\n                \"effective_until\": {\"type\": \"datetime\"},\n                \"superseded\": {\"type\": \"boolean\"}\n            }\n        }\n    },\n    relationship_types={\n        \"EXTRACTED_FROM\": {\n            \"allowed_source_types\": [\"Claim\"],\n            \"allowed_target_types\": [\"Source\"]\n        },\n        \"CONFLICTS_WITH\": {\n            \"allowed_source_types\": [\"Claim\"],\n            \"allowed_target_types\": [\"Claim\"]\n        },\n        \"MEMBER_OF\": {\n            \"allowed_source_types\": [\"Claim\"],\n            \"allowed_target_types\": [\"ConflictSet\"]\n        },\n        \"SUPERSEDES\": {\n            \"allowed_source_types\": [\"KnowledgeVersion\"],\n            \"allowed_target_types\": [\"KnowledgeVersion\"]\n        },\n        \"VERSION_OF\": {\n            \"allowed_source_types\": [\"Claim\"],\n            \"allowed_target_types\": [\"KnowledgeVersion\"]\n        }\n    }\n)\n\n# Upload document with extraction\nclient.document.upload(\n    file=open(\"api_spec_v2.pdf\", \"rb\"),\n    schema_id=schema.data.id,\n    metadata={\"version\": \"v2.0\", \"authority\": \"official\"}\n)\n\n# Query conflicts\nconflicts = client.graphql.query(\"\"\"\n    query GetConflicts($subject: String!) {\n      conflict_sets(where: { \n        subject: $subject, \n        resolution_status: \"unresolved\" \n      }) {\n        subject\n        predicate\n        claims {\n          statement\n          confidence\n          sources {\n            document_id\n            authority\n            version\n          }\n        }\n      }\n    }\n\"\"\", {\"subject\": \"rate limit\"})\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"architecture-overview"},"children":["Architecture Overview"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"┌─────────────────────────────────────────┐\n│      OSMOSIS APPLICATION LAYER          │\n│  • Conflict detection service           │\n│  • Corroboration scoring                │\n│  • Version history tracking             │\n│  • Inference engine                     │\n│  • Resolution rules                     │\n└─────────────────────────────────────────┘\n                  ↕\n┌─────────────────────────────────────────┐\n│         PAPR MEMORY API                 │\n│  • Knowledge graph (Neo4j)              │\n│  • Custom schema support                │\n│  • Entity resolution                    │\n│  • Hybrid retrieval                     │\n│  • GraphQL analytics                    │\n│  • Provenance tracking                  │\n└─────────────────────────────────────────┘\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Papr handles:"]}," Storage, retrieval, entity merging, graph queries",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["You handle:"]}," Governance logic, conflict detection, scoring, versioning"]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"why-this-works"},"children":["Why This Works"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"1.-1"},"children":["1. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Schema Flexibility"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You define exactly what a \"claim\" is, what properties it has, how it relates to sources."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"2.-1"},"children":["2. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Node Constraints"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Force metadata onto every extracted claim:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"memory_policy={\n    \"node_constraints\": [{\n        \"node_type\": \"Claim\",\n        \"set\": {\n            \"confidence\": 0.95,\n            \"extracted_at\": \"2026-02-16T10:00:00Z\",\n            \"version\": \"v2.1\"\n        }\n    }]\n}\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"3.-1"},"children":["3. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["GraphQL Power"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Complex queries for governance:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"graphql","header":{"controls":{"copy":{}}},"source":"query ConflictAnalysis($subject: String!) {\n  conflict_sets(where: { subject: $subject }) {\n    claims {\n      statement\n      sources {\n        authority\n        version\n      }\n    }\n  }\n}\n","lang":"graphql"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"4.-1"},"children":["4. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Provenance Built-In"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Every memory has ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["source"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["created_at"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["metadata.document_id"]},". Trace every claim back to evidence."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"5.-1"},"children":["5. ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Entity Resolution"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["\"Product X\" mentioned in 5 documents → one node. Corroboration counting works automatically."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"what-you-still-build"},"children":["What You Still Build"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"resolution-rules"},"children":["Resolution Rules"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Simple logic - no complex service needed\nasync def resolve_conflict(claims):\n    # Count-based: Pick claim with most sources\n    # Freshness-based: Pick most recent\n    # Authority-based: Pick official over unofficial\n    # Combined: Your formula\n    \n    winner = max(claims, key=lambda c: \n        len(c['sources']) * 0.5 +  # Source count\n        sum(1 for s in c['sources'] if s['authority'] == 'official') * 0.3 +  # Authority\n        recency_weight(c['sources']) * 0.2  # Freshness\n    )\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"version-tracking"},"children":["Version Tracking"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"async def track_version(claim_id, new_version):\n    # Create KnowledgeVersion nodes\n    # Link SUPERSEDES relationships\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"inference-engine"},"children":["Inference Engine"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"async def apply_inference_rules():\n    # Transitive: A→B, B→C ⇒ A→C\n    # Contradiction: A→B, A→¬B ⇒ conflict\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"time--cost-estimates"},"children":["Time & Cost Estimates"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"development-timeline"},"children":["Development Timeline"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Phase 1 (2 weeks):"]}," POC with 3 test documents"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Phase 2 (4 weeks):"]}," Core governance services"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Phase 3 (4 weeks):"]}," Production hardening"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Total: ~10 weeks to production"]}," (vs 6-12 months building from scratch)"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"cost-10000-documents"},"children":["Cost (10,000 documents)"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Papr Cloud: ~$1,100/month (storage + API calls)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Custom services: ~$70/month (compute + database)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Total: ~$1,200/month"]}]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"recommended-next-steps"},"children":["Recommended Next Steps"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Week 1:"]}," Quick prototype"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Create Osmosis schema in Papr"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Upload 3 test documents"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Extract claims (auto mode)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Query via GraphQL"]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Week 2:"]}," Validate approach"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Write conflict detection script"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Test corroboration counting"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Verify provenance tracking"]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Decision point:"]}," If POC works, commit to Papr as foundation"]}]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"my-assessment"},"children":["My Assessment"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Papr is positioned as both:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["✅ ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Retrieval & memory layer"]}," (your threshold requirement)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["✅ ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Knowledge graph foundation"]}," for governance (90% of infrastructure)"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What Papr is NOT:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["❌ Complete governance system out-of-box"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["❌ Built-in conflict detection"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["❌ Automatic temporal snapshots"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["But you'd need custom governance logic regardless of database choice."]}," The question is whether you want to build:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Graph database + entity resolution + retrieval + schema system + provenance (Papr does this), OR"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Just governance logic on top of existing foundation (Papr route)"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Recommendation:"]}," Use Papr. Saves 6-12 months. Custom schema system enables exactly what you need."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"questions-for-you"},"children":["Questions for You"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Scale:"]}," How many documents? How many cross-references?"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Latency:"]}," Real-time conflict detection, or batch jobs acceptable?"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Inference:"]}," How complex? (Simple transitive, or full first-order logic?)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Version granularity:"]}," Document-level or statement-level versioning?"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["POC timeline:"]}," Can you allocate 2 weeks for proof-of-concept?"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"lets-talk"},"children":["Let's Talk"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["I've prepared a full technical analysis (50+ pages) covering:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Detailed answers to each question with code examples"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Complete schema design for Osmosis"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Full workflow (upload → extract → detect → resolve → query)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Performance considerations & optimization strategies"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Decision framework & trade-off analysis"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Ready to dive deeper?"]}," Let's schedule a call to walk through:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Schema design review"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Governance services architecture"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Integration patterns"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Performance optimization"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Book time here: [calendly link]"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Or reply with questions and I'll follow up."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Best regards,",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Amir",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Papr Team"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["P.S. The fact that you're thinking about provenance, corroboration, and versioning tells me you're building something sophisticated. Papr's schema system was designed exactly for this kind of domain-specific knowledge modeling. Happy to help you nail the design."]}]},"headings":[{"value":"Email Response: Osmosis + Papr Integration Analysis","id":"email-response-osmosis--papr-integration-analysis","depth":1},{"value":"To: Osmosis Developer","id":"to-osmosis-developer","depth":2},{"value":"","id":null,"depth":2},{"value":"Your 5 Questions - Direct Answers","id":"your-5-questions---direct-answers","depth":2},{"value":"1.","id":"1.","depth":3},{"value":"2.","id":"2.","depth":3},{"value":"3.","id":"3.","depth":3},{"value":"4.","id":"4.","depth":3},{"value":"5.","id":"5.","depth":3},{"value":"Concrete Schema Example for Osmosis","id":"concrete-schema-example-for-osmosis","depth":2},{"value":"Architecture Overview","id":"architecture-overview","depth":2},{"value":"Why This Works","id":"why-this-works","depth":2},{"value":"1.","id":"1.-1","depth":3},{"value":"2.","id":"2.-1","depth":3},{"value":"3.","id":"3.-1","depth":3},{"value":"4.","id":"4.-1","depth":3},{"value":"5.","id":"5.-1","depth":3},{"value":"What You Still Build","id":"what-you-still-build","depth":2},{"value":"Resolution Rules","id":"resolution-rules","depth":3},{"value":"Version Tracking","id":"version-tracking","depth":3},{"value":"Inference Engine","id":"inference-engine","depth":3},{"value":"Time & Cost Estimates","id":"time--cost-estimates","depth":2},{"value":"Development Timeline","id":"development-timeline","depth":3},{"value":"Cost (10,000 documents)","id":"cost-10000-documents","depth":3},{"value":"Recommended Next Steps","id":"recommended-next-steps","depth":2},{"value":"My Assessment","id":"my-assessment","depth":2},{"value":"Questions for You","id":"questions-for-you","depth":2},{"value":"Let's Talk","id":"lets-talk","depth":2}],"frontmatter":{"seo":{"title":"Email Response: Osmosis + Papr Integration Analysis"}},"lastModified":"2026-04-22T01:40:48.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/internal/planning/osmosis-email-response","userData":{"isAuthenticated":false,"teams":["anonymous"]}}