// Package steme provides a Go SDK for StemeDB, a probabilistic knowledge graph // that stores Claims, not Facts. // // StemeDB is an append-only Merkle DAG with read-time conflict resolution via // Lenses. Think "Git for Truth" - conflicting assertions coexist and are // resolved at query time. // // # Quick Start // // Create a signer and client: // // signer, err := steme.GenerateSigner() // if err != nil { // log.Fatal(err) // } // client := steme.NewClient("http://localhost:3000", signer) // // Build and submit an assertion: // // assertion := steme.NewAssertion("Tesla_Inc", "has_revenue"). // WithNumber(96.7). // WithConfidence(0.95). // WithSourceHash("0000...64 hex chars..."). // Build() // // hash, err := client.Assert(context.Background(), assertion) // // Query with lens-based conflict resolution: // // params := steme.NewQuery(). // WithSubject("Tesla_Inc"). // WithLens(steme.LensConsensus). // Build() // result, err := client.Query(context.Background(), params) // // # Lenses // // StemeDB resolves conflicts at query time using Lenses: // - Recency: Latest timestamp wins // - Consensus: Most common value wins // - Authority: Weighted by agent reputation // - VoteAwareConsensus: Highest vote weight // - TrustAwareAuthority: Weighted by TrustRank // // # Security // // All assertions are cryptographically signed using Ed25519. The SDK // automatically signs assertions when you call client.Assert(). // // Never commit private key seeds to version control. Use environment // variables or secret management: // // signer, err := steme.SignerFromEnv("STEME_PRIVATE_KEY") // // # Error Handling // // The SDK uses sentinel errors for common cases: // // if errors.Is(err, steme.ErrInvalidConfidence) { // // handle validation error // } // // API errors provide structured information: // // var apiErr *steme.APIError // if errors.As(err, &apiErr) { // log.Printf("API error [%d]: %s", apiErr.StatusCode, apiErr.Message) // } package steme