{"templateId":"markdown","sharedDataIds":{},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Osmosis Analysis - Updated Summary","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":"osmosis-analysis---updated-summary"},"children":["Osmosis Analysis - Updated Summary"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Date:"]}," February 16, 2026",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Status:"]}," Analysis updated based on accurate Papr capabilities"]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"key-corrections-made"},"children":["Key Corrections Made"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The initial analysis underestimated how much Papr handles automatically. Here are the corrections:"]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"1.-conflicting-statements---much-more-automatic"},"children":["1. Conflicting Statements - Much More Automatic"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"initial-assessment-incorrect"},"children":["Initial Assessment (Incorrect)"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["❌ Claimed: \"No automatic conflict detection\""]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["❌ Claimed: \"Developer must build conflict detection service\""]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["❌ Implied: Complex background services needed"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"corrected-assessment-accurate"},"children":["Corrected Assessment (Accurate)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["✅ ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Papr handles automatically:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Deduplication"]},": Define ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["unique_identifiers: [\"subject\", \"predicate\", \"object\"]"]}," in schema"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Multi-source tracking"]},": Same claim from 3 documents → ONE node with 3 EXTRACTED_FROM relationships"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Source counting"]},": GraphQL automatically traverses relationships"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["✅ ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Conflict detection is just a query:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"query = \"\"\"\nquery FindConflicts($subject: String!) {\n  claims(where: { subject: $subject }) {\n    object  # Different values = conflict\n    sources { document_id, version, authority }  # Count automatically\n  }\n}\n\"\"\"\n\n# Returns all claims for subject, grouped by Papr's dedup\n# If multiple different 'object' values → conflict detected\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["✅ ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Developer only adds:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Resolution rules (count > 3? most recent? official sources?)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Optional: ConflictSet nodes for workflow tracking"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Complexity reduction: From \"complex service\" to \"simple query + resolution logic\""]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"2.-contextual-metadata-vs-claims---clearer-mechanisms"},"children":["2. Contextual Metadata vs Claims - Clearer Mechanisms"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"initial-assessment-vague"},"children":["Initial Assessment (Vague)"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["⚠️ Said: \"Distinction possible but must be explicitly modeled\""]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["⚠️ Unclear about mechanisms"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"corrected-assessment-specific"},"children":["Corrected Assessment (Specific)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["✅ ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Two clear mechanisms:"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["1. Memory metadata"]}," (about the source):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"metadata={\n    \"version\": \"v2.0\",\n    \"authority\": \"official\",\n    \"document_type\": \"specification\"\n}\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["2. Property overrides"]}," (injected onto nodes):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"memory_policy={\n    \"node_constraints\": [{\n        \"node_type\": \"Claim\",\n        \"set\": {\n            \"version\": \"v2.0\",  # Forced onto node\n            \"authority\": \"official\"  # Forced onto node\n            # LLM still extracts: subject, predicate, object\n        }\n    }]\n}\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Key insight:"]}," Metadata vs extracted claims vs injected properties are three distinct, well-defined mechanisms."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"3.-versioned-knowledge---simpler-than-described"},"children":["3. Versioned Knowledge - Simpler Than Described"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"initial-assessment-overcomplicated"},"children":["Initial Assessment (Overcomplicated)"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["⚠️ Emphasized: \"Must model versions as separate nodes\""]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["⚠️ Made it seem complex"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"corrected-assessment-two-simple-options"},"children":["Corrected Assessment (Two Simple Options)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["✅ ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Option 1: Version as property"]}," (simplest):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"memory_policy={\n    \"node_constraints\": [{\n        \"node_type\": \"Claim\",\n        \"set\": {\n            \"version\": \"v2.0\",\n            \"effective_from\": \"2025-01-01\",\n            \"effective_until\": None  # Current\n        }\n    }]\n}\n\n# Query by version\nquery = \"claims(where: { subject: '...', version: 'v2.0' })\"\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["✅ ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Option 2: Separate version nodes"]}," (for complex version chains):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Create KnowledgeVersion nodes\n# Link with SUPERSEDES relationships\n# Query version history\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Key insight:"]}," Property injection via node_constraints makes version tracking trivial. Separate nodes only needed for complex version genealogy."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"4.-multi-source-corroboration---built-in-not-custom"},"children":["4. Multi-Source Corroboration - Built-In, Not Custom"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"initial-assessment-underestimated"},"children":["Initial Assessment (Underestimated)"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["❌ Claimed: \"No automatic source counting\""]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["❌ Claimed: \"Developer must build corroboration tracking\""]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["❌ Suggested: Background service to update scores"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"corrected-assessment-much-simpler"},"children":["Corrected Assessment (Much Simpler)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["✅ ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Papr handles automatically:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Deduplication merges same claim → ONE node"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Each source gets EXTRACTED_FROM relationship"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["GraphQL traverses relationships and returns all sources"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["✅ ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Corroboration is just counting:"]}]},{"$$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      version\n      authority\n      date\n    }\n  }\n}\n\"\"\"\n\n# In your code:\nfor claim in result['claims']:\n    source_count = len(claim['sources'])\n    official_count = sum(1 for s in claim['sources'] if s['authority'] == 'official')\n    \n    # Apply resolution rule\n    if source_count >= 3 and official_count >= 2:\n        confidence = \"high\"\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["✅ ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Optional: Cache score on node:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Only if you want to avoid recounting\nmemory_policy={\n    \"node_constraints\": [{\n        \"node_type\": \"Claim\",\n        \"set\": {\"source_count\": 3, \"corroboration_score\": 0.6}\n    }]\n}\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Key insight:"]}," Counting sources is a simple length() operation on GraphQL result. No background service needed."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"updated-architecture-assessment"},"children":["Updated Architecture Assessment"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"what-papr-handles-revised-up-to-90"},"children":["What Papr Handles (Revised Up to 90%)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Automatic (No Code Needed):"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["✅ Knowledge graph storage"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["✅ Deduplication (same claim from multiple sources)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["✅ Multi-source tracking (EXTRACTED_FROM relationships)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["✅ Source counting (GraphQL traversal)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["✅ Entity resolution"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["✅ Provenance (automatic)"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Developer Controls (via Config):"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["✅ Schema design (what properties claims have)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["✅ unique_identifiers (what makes claims identical)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["✅ Property injection (version, authority, etc.)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["✅ GraphQL queries (conflict detection, analysis)"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"what-developer-builds-revised-down-to-10"},"children":["What Developer Builds (Revised Down to 10%)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Simple Logic:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Resolution rules (which claim wins in conflict?)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Inference engine (if A→B and B→C, then A→C)"]},{"$$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":["No longer needed:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["❌ Conflict detection service (just a query)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["❌ Source counting service (GraphQL does it)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["❌ Deduplication logic (Papr handles it)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["❌ Complex background jobs (most things are queries)"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"revised-complexity-assessment"},"children":["Revised Complexity Assessment"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"initial-estimate"},"children":["Initial Estimate"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Papr: 70% of infrastructure"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Developer: 30% custom services"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"corrected-estimate"},"children":["Corrected Estimate"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Papr: 90% of infrastructure (+ automatic dedup, source counting, conflict identification)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Developer: 10% domain logic (resolution rules, inference, optional workflow)"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"impact-on-timeline"},"children":["Impact on Timeline"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"initial-estimate-1"},"children":["Initial Estimate"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Phase 1 (POC): 2 weeks"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Phase 2 (Services): 4 weeks"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Phase 3 (Production): 4 weeks"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Total: 10 weeks"]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"revised-estimate"},"children":["Revised Estimate"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Phase 1 (POC): 1 week (simpler than expected)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Phase 2 (Resolution): 2 weeks (just rules, no services)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Phase 3 (Production): 2 weeks (less to harden)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Total: 5 weeks"]}," ← 50% reduction"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Why?"]}," Because conflict detection, source counting, and corroboration are built-in queries, not custom services."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"updated-recommendation"},"children":["Updated Recommendation"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"strength-of-recommendation-even-stronger"},"children":["Strength of Recommendation: Even Stronger"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Before:"]}," \"Yes, use Papr - saves 6-12 months\""]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Now:"]}," \"Absolutely yes - saves 6-12 months AND the custom logic is trivial\""]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Reasoning:"]}]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Deduplication is automatic"]}," - Define unique_identifiers in schema, done"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Source counting is automatic"]}," - GraphQL returns sources, just count them"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Conflict detection is automatic"]}," - Query by subject, check if multiple values"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Resolution is simple logic"]}," - Just max() with your scoring function"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Version tracking is property injection"]}," - Add version via node_constraints"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["What seemed complex (background services) is actually simple (GraphQL queries + basic logic)."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"key-messages-for-developer"},"children":["Key Messages for Developer"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"message-1-deduplication-handles-most-of-it"},"children":["Message 1: Deduplication Handles Most of It"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"\"When you define unique_identifiers on your Claim node type, Papr automatically:\n- Merges same claim from multiple documents into ONE node\n- Creates EXTRACTED_FROM relationship to each source\n- Makes source counting a simple GraphQL query\n\nConflict detection becomes: 'Are there multiple Claims with different objects for same subject?'\"\n"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"message-2-property-injection-is-powerful"},"children":["Message 2: Property Injection is Powerful"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"\"Use node_constraints.set to inject metadata onto extracted nodes:\n- version: \"v2.0\"\n- authority: \"official\"\n- extraction_date: \"2026-01-15\"\n\nNo need for separate metadata nodes in most cases.\"\n"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"message-3-resolution-is-just-logic"},"children":["Message 3: Resolution is Just Logic"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"\"Conflict resolution is:\n\nwinner = max(claims, key=lambda c: \n    len(c['sources']) * weight_count +\n    official_count(c['sources']) * weight_authority +\n    recency(c['sources']) * weight_freshness\n)\n\nThat's it. No complex service needed.\"\n"},"children":[]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"example-complete-workflow-simplified"},"children":["Example: Complete Workflow (Simplified)"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-1-define-schema-one-time"},"children":["Step 1: Define Schema (One Time)"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"schema = client.schemas.create(\n    name=\"Osmosis\",\n    node_types={\n        \"Claim\": {\n            \"properties\": {\n                \"subject\": {\"type\": \"string\"},\n                \"predicate\": {\"type\": \"string\"},\n                \"object\": {\"type\": \"string\"},\n                \"version\": {\"type\": \"string\"},\n                \"authority\": {\"type\": \"string\"}\n            },\n            \"unique_identifiers\": [\"subject\", \"predicate\", \"object\"]  # ← Dedup key\n        }\n    }\n)\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-2-upload-documents-automatic"},"children":["Step 2: Upload Documents (Automatic)"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Upload 3 documents mentioning \"API rate limit is 1000/hour\"\nfor doc in [\"spec_v2.pdf\", \"blog_post.md\", \"email_thread.txt\"]:\n    client.document.upload(\n        file=open(doc, \"rb\"),\n        schema_id=schema.id,\n        metadata={\"authority\": get_authority(doc)}\n    )\n\n# Papr automatically:\n# - Extracts claim: {subject: \"API rate limit\", predicate: \"is\", object: \"1000/hour\"}\n# - Deduplicates to ONE Claim node\n# - Creates 3 EXTRACTED_FROM relationships\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-3-query-for-conflicts-simple"},"children":["Step 3: Query for Conflicts (Simple)"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"query = \"\"\"\nquery FindConflicts($subject: String!) {\n  claims(where: { subject: $subject }) {\n    object\n    sources { document_id, authority }\n  }\n}\n\"\"\"\n\nresult = await client.graphql.query(query, {\"subject\": \"API rate limit\"})\n\n# Check for different values\nvalues = set(c['object'] for c in result['claims'])\nif len(values) > 1:\n    print(f\"CONFLICT: {values}\")\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-4-resolve-simple-logic"},"children":["Step 4: Resolve (Simple Logic)"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"# Apply resolution rule\nfor claim in result['claims']:\n    score = len(claim['sources']) * 2 + sum(1 for s in claim['sources'] if s['authority'] == 'official') * 5\n    print(f\"{claim['object']}: score={score}\")\n\nwinner = max(result['claims'], key=lambda c: resolution_score(c))\nprint(f\"Winner: {winner['object']}\")\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Total complexity: ~50 lines of code. No background services. No complex workflows."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"bottom-line"},"children":["Bottom Line"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The initial analysis was conservative about what Papr provides. The reality is:"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Papr handles 90% automatically:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Deduplication via unique_identifiers"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Multi-source tracking via relationships"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Source counting via GraphQL"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Property injection via node_constraints"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Developer adds 10% as simple logic:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Resolution rules (scoring function)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Optional: Workflow tracking"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Optional: Inference rules"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Timeline reduced from 10 weeks to 5 weeks."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["The case for using Papr is even stronger than initially assessed."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"files-updated"},"children":["Files Updated"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OSMOSIS-USE-CASE-ANALYSIS.md"]}," - Full technical analysis"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OSMOSIS-EMAIL-RESPONSE.md"]}," - Email to developer"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OSMOSIS-WHY-IT-WORKS.md"]}," - Deep dive on \"why schema works\""]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OSMOSIS-UPDATED-SUMMARY.md"]}," - This document (corrections)"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["All documents now accurately reflect Papr's automatic capabilities."]}]},"headings":[{"value":"Osmosis Analysis - Updated Summary","id":"osmosis-analysis---updated-summary","depth":1},{"value":"Key Corrections Made","id":"key-corrections-made","depth":2},{"value":"1. Conflicting Statements - Much More Automatic","id":"1.-conflicting-statements---much-more-automatic","depth":2},{"value":"Initial Assessment (Incorrect)","id":"initial-assessment-incorrect","depth":3},{"value":"Corrected Assessment (Accurate)","id":"corrected-assessment-accurate","depth":3},{"value":"2. Contextual Metadata vs Claims - Clearer Mechanisms","id":"2.-contextual-metadata-vs-claims---clearer-mechanisms","depth":2},{"value":"Initial Assessment (Vague)","id":"initial-assessment-vague","depth":3},{"value":"Corrected Assessment (Specific)","id":"corrected-assessment-specific","depth":3},{"value":"3. Versioned Knowledge - Simpler Than Described","id":"3.-versioned-knowledge---simpler-than-described","depth":2},{"value":"Initial Assessment (Overcomplicated)","id":"initial-assessment-overcomplicated","depth":3},{"value":"Corrected Assessment (Two Simple Options)","id":"corrected-assessment-two-simple-options","depth":3},{"value":"4. Multi-Source Corroboration - Built-In, Not Custom","id":"4.-multi-source-corroboration---built-in-not-custom","depth":2},{"value":"Initial Assessment (Underestimated)","id":"initial-assessment-underestimated","depth":3},{"value":"Corrected Assessment (Much Simpler)","id":"corrected-assessment-much-simpler","depth":3},{"value":"Updated Architecture Assessment","id":"updated-architecture-assessment","depth":2},{"value":"What Papr Handles (Revised Up to 90%)","id":"what-papr-handles-revised-up-to-90","depth":3},{"value":"What Developer Builds (Revised Down to 10%)","id":"what-developer-builds-revised-down-to-10","depth":3},{"value":"Revised Complexity Assessment","id":"revised-complexity-assessment","depth":2},{"value":"Initial Estimate","id":"initial-estimate","depth":3},{"value":"Corrected Estimate","id":"corrected-estimate","depth":3},{"value":"Impact on Timeline","id":"impact-on-timeline","depth":2},{"value":"Initial Estimate","id":"initial-estimate-1","depth":3},{"value":"Revised Estimate","id":"revised-estimate","depth":3},{"value":"Updated Recommendation","id":"updated-recommendation","depth":2},{"value":"Strength of Recommendation: Even Stronger","id":"strength-of-recommendation-even-stronger","depth":3},{"value":"Key Messages for Developer","id":"key-messages-for-developer","depth":2},{"value":"Message 1: Deduplication Handles Most of It","id":"message-1-deduplication-handles-most-of-it","depth":3},{"value":"Message 2: Property Injection is Powerful","id":"message-2-property-injection-is-powerful","depth":3},{"value":"Message 3: Resolution is Just Logic","id":"message-3-resolution-is-just-logic","depth":3},{"value":"Example: Complete Workflow (Simplified)","id":"example-complete-workflow-simplified","depth":2},{"value":"Step 1: Define Schema (One Time)","id":"step-1-define-schema-one-time","depth":3},{"value":"Step 2: Upload Documents (Automatic)","id":"step-2-upload-documents-automatic","depth":3},{"value":"Step 3: Query for Conflicts (Simple)","id":"step-3-query-for-conflicts-simple","depth":3},{"value":"Step 4: Resolve (Simple Logic)","id":"step-4-resolve-simple-logic","depth":3},{"value":"Bottom Line","id":"bottom-line","depth":2},{"value":"Files Updated","id":"files-updated","depth":2}],"frontmatter":{"seo":{"title":"Osmosis Analysis - Updated Summary"}},"lastModified":"2026-04-22T01:40:48.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/internal/planning/osmosis-updated-summary","userData":{"isAuthenticated":false,"teams":["anonymous"]}}