// 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:18180", 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
