[{"data":1,"prerenderedAt":3881},["ShallowReactive",2],{"navigation":3,"\u002Fservices\u002Fcustody":927,"mdc--27cy0v-key":3839,"mdc-gad51n-key":3855,"mdc-u9jrh0-key":3869},[4,40,114,446,474,498,596,903],{"title":5,"path":6,"stem":7,"children":8},"Architecture","\u002Farchitecture","architecture",[9,14,28,32,36],{"title":10,"path":6,"stem":11,"access":12,"icon":13},"Overview","architecture\u002Findex","public","i-lucide-network",{"title":10,"path":15,"stem":16,"children":17,"access":12,"icon":19},"\u002Farchitecture\u002Fkernel","architecture\u002F1.kernel\u002Findex",[18,20,24],{"title":10,"path":15,"stem":16,"access":12,"icon":19},"i-lucide-box",{"title":21,"path":22,"stem":23,"access":12},"Enclave","\u002Farchitecture\u002Fkernel\u002Fenclave","architecture\u002F1.kernel\u002Fenclave",{"title":25,"path":26,"stem":27,"access":12},"Forking the enclave","\u002Farchitecture\u002Fkernel\u002Fforking-the-enclave","architecture\u002F1.kernel\u002Fforking-the-enclave",{"title":29,"path":30,"stem":31,"access":12},"Ports","\u002Farchitecture\u002Fports","architecture\u002F2.ports",{"title":33,"path":34,"stem":35,"access":12},"Service layers","\u002Farchitecture\u002Fservice-layers","architecture\u002F3.service-layers",{"title":37,"path":38,"stem":39,"access":12},"Families","\u002Farchitecture\u002Ffamilies","architecture\u002F4.families",{"title":41,"path":42,"stem":43,"children":44},"Core","\u002Fcore","core",[45,47,50,53,56,88,97],{"title":10,"path":42,"stem":46,"access":12,"icon":19},"core\u002Findex",{"title":10,"path":48,"stem":49,"access":12},"\u002Fcore\u002F01-overview","core\u002F01-overview",{"title":10,"path":51,"stem":52,"access":12},"\u002Fcore\u002F05-stores","core\u002F05-stores",{"title":10,"path":54,"stem":55,"access":12},"\u002Fcore\u002F06-permissions-and-keyring","core\u002F06-permissions-and-keyring",{"title":10,"path":57,"stem":58,"children":59,"access":12},"\u002Fcore\u002Fnoydb","core\u002F2.noydb\u002Findex",[60,61,65,68,72,76,80,84],{"title":10,"path":57,"stem":58,"access":12},{"title":62,"path":63,"stem":64,"access":12},"Noydb","\u002Fcore\u002Fnoydb\u002Fmethods","core\u002F2.noydb\u002F1.methods",{"title":21,"path":66,"stem":67,"access":12},"\u002Fcore\u002Fnoydb\u002Fenclave","core\u002F2.noydb\u002F2.enclave",{"title":69,"path":70,"stem":71,"access":12},"Secret & keyring","\u002Fcore\u002Fnoydb\u002Fkeyring","core\u002F2.noydb\u002F3.keyring",{"title":73,"path":74,"stem":75,"access":12},"Authentication","\u002Fcore\u002Fnoydb\u002Fauthentication","core\u002F2.noydb\u002F4.authentication",{"title":77,"path":78,"stem":79,"access":12},"Auth recovery","\u002Fcore\u002Fnoydb\u002Frecovery","core\u002F2.noydb\u002F5.recovery",{"title":81,"path":82,"stem":83,"access":12},"Configuration","\u002Fcore\u002Fnoydb\u002Fconfiguration","core\u002F2.noydb\u002F6.configuration",{"title":85,"path":86,"stem":87,"access":12},"Strategies","\u002Fcore\u002Fnoydb\u002Fstrategies","core\u002F2.noydb\u002F7.strategies",{"title":10,"path":89,"stem":90,"children":91,"access":12},"\u002Fcore\u002Fvault","core\u002F3.vault\u002Findex",[92,93],{"title":10,"path":89,"stem":90,"access":12},{"title":94,"path":95,"stem":96,"access":12},"Vault","\u002Fcore\u002Fvault\u002Fmethods","core\u002F3.vault\u002F1.methods",{"title":10,"path":98,"stem":99,"children":100,"access":12},"\u002Fcore\u002Fcollection","core\u002F4.collection\u002Findex",[101,102,106,110],{"title":10,"path":98,"stem":99,"access":12},{"title":103,"path":104,"stem":105,"access":12},"Collection","\u002Fcore\u002Fcollection\u002Fmethods","core\u002F4.collection\u002F1.methods",{"title":107,"path":108,"stem":109,"access":12},"Querying","\u002Fcore\u002Fcollection\u002Fquerying","core\u002F4.collection\u002F2.querying",{"title":111,"path":112,"stem":113,"access":12},"Schema","\u002Fcore\u002Fcollection\u002Fschema","core\u002F4.collection\u002F3.schema",{"title":37,"path":115,"stem":116,"children":117},"\u002Ffamilies","families",[118,121,168,194,208,212,216,294,340],{"title":10,"path":115,"stem":119,"access":12,"icon":120},"families\u002Findex","i-lucide-plug",{"title":122,"path":123,"stem":124,"children":125,"access":12,"icon":127},"as-Exports","\u002Ffamilies\u002Fas","families\u002Fas\u002Findex",[126,128,132,136,140,144,148,152,156,160,164],{"title":122,"path":123,"stem":124,"access":12,"icon":127},"i-lucide-book-open",{"title":129,"path":130,"stem":131,"access":12},"aws-s3","\u002Ffamilies\u002Fas\u002Faws-s3","families\u002Fas\u002Faws-s3",{"title":133,"path":134,"stem":135,"access":12},"blob","\u002Ffamilies\u002Fas\u002Fblob","families\u002Fas\u002Fblob",{"title":137,"path":138,"stem":139,"access":12},"csv","\u002Ffamilies\u002Fas\u002Fcsv","families\u002Fas\u002Fcsv",{"title":141,"path":142,"stem":143,"access":12},"json","\u002Ffamilies\u002Fas\u002Fjson","families\u002Fas\u002Fjson",{"title":145,"path":146,"stem":147,"access":12},"ndjson","\u002Ffamilies\u002Fas\u002Fndjson","families\u002Fas\u002Fndjson",{"title":149,"path":150,"stem":151,"access":12},"noydb","\u002Ffamilies\u002Fas\u002Fnoydb","families\u002Fas\u002Fnoydb",{"title":153,"path":154,"stem":155,"access":12},"sql","\u002Ffamilies\u002Fas\u002Fsql","families\u002Fas\u002Fsql",{"title":157,"path":158,"stem":159,"access":12},"xlsx","\u002Ffamilies\u002Fas\u002Fxlsx","families\u002Fas\u002Fxlsx",{"title":161,"path":162,"stem":163,"access":12},"xml","\u002Ffamilies\u002Fas\u002Fxml","families\u002Fas\u002Fxml",{"title":165,"path":166,"stem":167,"access":12},"zip","\u002Ffamilies\u002Fas\u002Fzip","families\u002Fas\u002Fzip",{"title":169,"path":170,"stem":171,"children":172,"access":12,"icon":127},"at-Seals","\u002Ffamilies\u002Fat","families\u002Fat\u002Findex",[173,174,178,182,186,190],{"title":169,"path":170,"stem":171,"access":12,"icon":127},{"title":175,"path":176,"stem":177,"access":12},"aws-kms","\u002Ffamilies\u002Fat\u002Faws-kms","families\u002Fat\u002Faws-kms",{"title":179,"path":180,"stem":181,"access":12},"azure-keyvault","\u002Ffamilies\u002Fat\u002Fazure-keyvault","families\u002Fat\u002Fazure-keyvault",{"title":183,"path":184,"stem":185,"access":12},"env","\u002Ffamilies\u002Fat\u002Fenv","families\u002Fat\u002Fenv",{"title":187,"path":188,"stem":189,"access":12},"gcp-kms","\u002Ffamilies\u002Fat\u002Fgcp-kms","families\u002Fat\u002Fgcp-kms",{"title":191,"path":192,"stem":193,"access":12},"macos-keychain","\u002Ffamilies\u002Fat\u002Fmacos-keychain","families\u002Fat\u002Fmacos-keychain",{"title":195,"path":196,"stem":197,"children":198,"access":12,"icon":127},"by-Sessions","\u002Ffamilies\u002Fby","families\u002Fby\u002Findex",[199,200,204],{"title":195,"path":196,"stem":197,"access":12,"icon":127},{"title":201,"path":202,"stem":203,"access":12},"peer","\u002Ffamilies\u002Fby\u002Fpeer","families\u002Fby\u002Fpeer",{"title":205,"path":206,"stem":207,"access":12},"tabs","\u002Ffamilies\u002Fby\u002Ftabs","families\u002Fby\u002Ftabs",{"title":209,"path":210,"stem":211,"access":12},"Classifying a package","\u002Ffamilies\u002Fclassification","families\u002Fclassification",{"title":213,"path":214,"stem":215,"access":12},"Command-line tools","\u002Ffamilies\u002Fcli","families\u002Fcli",{"title":217,"path":218,"stem":219,"children":220,"access":12,"icon":127},"in-Frameworks","\u002Ffamilies\u002Fin","families\u002Fin\u002Findex",[221,222,226,230,234,238,242,246,250,254,258,262,266,270,274,278,282,286,290],{"title":217,"path":218,"stem":219,"access":12,"icon":127},{"title":223,"path":224,"stem":225,"access":12},"ai","\u002Ffamilies\u002Fin\u002Fai","families\u002Fin\u002Fai",{"title":227,"path":228,"stem":229,"access":12},"devtools","\u002Ffamilies\u002Fin\u002Fdevtools","families\u002Fin\u002Fdevtools",{"title":231,"path":232,"stem":233,"access":12},"devtools-tui","\u002Ffamilies\u002Fin\u002Fdevtools-tui","families\u002Fin\u002Fdevtools-tui",{"title":235,"path":236,"stem":237,"access":12},"liff","\u002Ffamilies\u002Fin\u002Fliff","families\u002Fin\u002Fliff",{"title":239,"path":240,"stem":241,"access":12},"nextjs","\u002Ffamilies\u002Fin\u002Fnextjs","families\u002Fin\u002Fnextjs",{"title":243,"path":244,"stem":245,"access":12},"nuxt","\u002Ffamilies\u002Fin\u002Fnuxt","families\u002Fin\u002Fnuxt",{"title":247,"path":248,"stem":249,"access":12},"pinia","\u002Ffamilies\u002Fin\u002Fpinia","families\u002Fin\u002Fpinia",{"title":251,"path":252,"stem":253,"access":12},"pwa","\u002Ffamilies\u002Fin\u002Fpwa","families\u002Fin\u002Fpwa",{"title":255,"path":256,"stem":257,"access":12},"react","\u002Ffamilies\u002Fin\u002Freact","families\u002Fin\u002Freact",{"title":259,"path":260,"stem":261,"access":12},"relay","\u002Ffamilies\u002Fin\u002Frelay","families\u002Fin\u002Frelay",{"title":263,"path":264,"stem":265,"access":12},"rest","\u002Ffamilies\u002Fin\u002Frest","families\u002Fin\u002Frest",{"title":267,"path":268,"stem":269,"access":12},"solid","\u002Ffamilies\u002Fin\u002Fsolid","families\u002Fin\u002Fsolid",{"title":271,"path":272,"stem":273,"access":12},"svelte","\u002Ffamilies\u002Fin\u002Fsvelte","families\u002Fin\u002Fsvelte",{"title":275,"path":276,"stem":277,"access":12},"tanstack-query","\u002Ffamilies\u002Fin\u002Ftanstack-query","families\u002Fin\u002Ftanstack-query",{"title":279,"path":280,"stem":281,"access":12},"tanstack-table","\u002Ffamilies\u002Fin\u002Ftanstack-table","families\u002Fin\u002Ftanstack-table",{"title":283,"path":284,"stem":285,"access":12},"vue","\u002Ffamilies\u002Fin\u002Fvue","families\u002Fin\u002Fvue",{"title":287,"path":288,"stem":289,"access":12},"yjs","\u002Ffamilies\u002Fin\u002Fyjs","families\u002Fin\u002Fyjs",{"title":291,"path":292,"stem":293,"access":12},"zustand","\u002Ffamilies\u002Fin\u002Fzustand","families\u002Fin\u002Fzustand",{"title":295,"path":296,"stem":297,"children":298,"access":12,"icon":127},"on-Auth","\u002Ffamilies\u002Fon","families\u002Fon\u002Findex",[299,300,304,308,312,316,320,324,328,332,336],{"title":295,"path":296,"stem":297,"access":12,"icon":127},{"title":301,"path":302,"stem":303,"access":12},"email-otp","\u002Ffamilies\u002Fon\u002Femail-otp","families\u002Fon\u002Femail-otp",{"title":305,"path":306,"stem":307,"access":12},"magic-link","\u002Ffamilies\u002Fon\u002Fmagic-link","families\u002Fon\u002Fmagic-link",{"title":309,"path":310,"stem":311,"access":12},"oidc","\u002Ffamilies\u002Fon\u002Foidc","families\u002Fon\u002Foidc",{"title":313,"path":314,"stem":315,"access":12},"password","\u002Ffamilies\u002Fon\u002Fpassword","families\u002Fon\u002Fpassword",{"title":317,"path":318,"stem":319,"access":12},"pin","\u002Ffamilies\u002Fon\u002Fpin","families\u002Fon\u002Fpin",{"title":321,"path":322,"stem":323,"access":12},"recovery","\u002Ffamilies\u002Fon\u002Frecovery","families\u002Fon\u002Frecovery",{"title":325,"path":326,"stem":327,"access":12},"shamir","\u002Ffamilies\u002Fon\u002Fshamir","families\u002Fon\u002Fshamir",{"title":329,"path":330,"stem":331,"access":12},"threat","\u002Ffamilies\u002Fon\u002Fthreat","families\u002Fon\u002Fthreat",{"title":333,"path":334,"stem":335,"access":12},"totp","\u002Ffamilies\u002Fon\u002Ftotp","families\u002Fon\u002Ftotp",{"title":337,"path":338,"stem":339,"access":12},"webauthn","\u002Ffamilies\u002Fon\u002Fwebauthn","families\u002Fon\u002Fwebauthn",{"title":341,"path":342,"stem":343,"children":344,"access":12,"icon":127},"to-Stores","\u002Ffamilies\u002Fto","families\u002Fto\u002Findex",[345,346,350,353,357,361,365,370,374,378,382,386,390,394,398,402,406,410,414,417,421,425,429,434,438,442],{"title":341,"path":342,"stem":343,"access":12,"icon":127},{"title":347,"path":348,"stem":349,"access":12},"aws-dynamo","\u002Ffamilies\u002Fto\u002Faws-dynamo","families\u002Fto\u002Faws-dynamo",{"title":129,"path":351,"stem":352,"access":12},"\u002Ffamilies\u002Fto\u002Faws-s3","families\u002Fto\u002Faws-s3",{"title":354,"path":355,"stem":356,"access":12},"browser-fs","\u002Ffamilies\u002Fto\u002Fbrowser-fs","families\u002Fto\u002Fbrowser-fs",{"title":358,"path":359,"stem":360,"access":12},"browser-idb","\u002Ffamilies\u002Fto\u002Fbrowser-idb","families\u002Fto\u002Fbrowser-idb",{"title":362,"path":363,"stem":364,"access":12},"browser-local","\u002Ffamilies\u002Fto\u002Fbrowser-local","families\u002Fto\u002Fbrowser-local",{"title":366,"path":367,"stem":368,"access":12,"icon":369},"Choosing a store","\u002Ffamilies\u002Fto\u002Fchoosing-a-store","families\u002Fto\u002Fchoosing-a-store","i-lucide-split",{"title":371,"path":372,"stem":373,"access":12},"cloudflare-d1","\u002Ffamilies\u002Fto\u002Fcloudflare-d1","families\u002Fto\u002Fcloudflare-d1",{"title":375,"path":376,"stem":377,"access":12},"cloudflare-r2","\u002Ffamilies\u002Fto\u002Fcloudflare-r2","families\u002Fto\u002Fcloudflare-r2",{"title":379,"path":380,"stem":381,"access":12},"drive","\u002Ffamilies\u002Fto\u002Fdrive","families\u002Fto\u002Fdrive",{"title":383,"path":384,"stem":385,"access":12},"file","\u002Ffamilies\u002Fto\u002Ffile","families\u002Fto\u002Ffile",{"title":387,"path":388,"stem":389,"access":12},"icloud","\u002Ffamilies\u002Fto\u002Ficloud","families\u002Fto\u002Ficloud",{"title":391,"path":392,"stem":393,"access":12},"memory","\u002Ffamilies\u002Fto\u002Fmemory","families\u002Fto\u002Fmemory",{"title":395,"path":396,"stem":397,"access":12},"meter","\u002Ffamilies\u002Fto\u002Fmeter","families\u002Fto\u002Fmeter",{"title":399,"path":400,"stem":401,"access":12},"mysql","\u002Ffamilies\u002Fto\u002Fmysql","families\u002Fto\u002Fmysql",{"title":403,"path":404,"stem":405,"access":12},"nfs","\u002Ffamilies\u002Fto\u002Fnfs","families\u002Fto\u002Fnfs",{"title":407,"path":408,"stem":409,"access":12},"postgres","\u002Ffamilies\u002Fto\u002Fpostgres","families\u002Fto\u002Fpostgres",{"title":411,"path":412,"stem":413,"access":12},"probe","\u002Ffamilies\u002Fto\u002Fprobe","families\u002Fto\u002Fprobe",{"title":263,"path":415,"stem":416,"access":12},"\u002Ffamilies\u002Fto\u002Frest","families\u002Fto\u002Frest",{"title":418,"path":419,"stem":420,"access":12},"smb","\u002Ffamilies\u002Fto\u002Fsmb","families\u002Fto\u002Fsmb",{"title":422,"path":423,"stem":424,"access":12},"sqlite","\u002Ffamilies\u002Fto\u002Fsqlite","families\u002Fto\u002Fsqlite",{"title":426,"path":427,"stem":428,"access":12},"ssh","\u002Ffamilies\u002Fto\u002Fssh","families\u002Fto\u002Fssh",{"title":430,"path":431,"stem":432,"access":12,"icon":433},"Store-locator descriptors","\u002Ffamilies\u002Fto\u002Fstore-locator","families\u002Fto\u002Fstore-locator","i-lucide-map-pin",{"title":435,"path":436,"stem":437,"access":12},"supabase","\u002Ffamilies\u002Fto\u002Fsupabase","families\u002Fto\u002Fsupabase",{"title":439,"path":440,"stem":441,"access":12},"turso","\u002Ffamilies\u002Fto\u002Fturso","families\u002Fto\u002Fturso",{"title":443,"path":444,"stem":445,"access":12},"webdav","\u002Ffamilies\u002Fto\u002Fwebdav","families\u002Fto\u002Fwebdav",{"title":447,"path":448,"stem":449,"children":450},"Faq","\u002Ffaq","faq",[451,454,458,462,466,470],{"title":10,"path":448,"stem":452,"access":12,"icon":453},"faq\u002Findex","i-lucide-circle-help",{"title":455,"path":456,"stem":457,"access":12},"Where can noy-db run?","\u002Ffaq\u002Fwhere-can-noy-db-run","faq\u002F1.where-can-noy-db-run",{"title":459,"path":460,"stem":461,"access":12},"Native mobile & PWA","\u002Ffaq\u002Fmobile-and-pwa","faq\u002F2.mobile-and-pwa",{"title":463,"path":464,"stem":465,"access":12},"Threat model","\u002Ffaq\u002Fthreat-model","faq\u002F3.threat-model",{"title":467,"path":468,"stem":469,"access":12},"Community & ecosystem","\u002Ffaq\u002Fcommunity-and-ecosystem","faq\u002F4.community-and-ecosystem",{"title":471,"path":472,"stem":473,"access":12},"Licensing","\u002Ffaq\u002Flicensing","faq\u002F5.licensing",{"title":475,"path":476,"stem":477,"children":478},"Glossary","\u002Fglossary","glossary",[479,482,486,490,494],{"title":10,"path":476,"stem":480,"access":12,"icon":481},"glossary\u002Findex","i-lucide-book-a",{"title":483,"path":484,"stem":485,"access":12},"Core vocabulary","\u002Fglossary\u002Fcore-vocabulary","glossary\u002Fcore-vocabulary",{"title":487,"path":488,"stem":489,"access":12},"Deletion vocabulary","\u002Fglossary\u002Fdeletion","glossary\u002Fdeletion",{"title":491,"path":492,"stem":493,"access":12},"Satellite collection vocabulary","\u002Fglossary\u002Fsatellite-collections","glossary\u002Fsatellite-collections",{"title":495,"path":496,"stem":497,"access":12},"Schema migration vocabulary","\u002Fglossary\u002Fschema-migration","glossary\u002Fschema-migration",{"title":499,"path":500,"stem":501,"children":502},"Recipes","\u002Frecipes","recipes",[503,506,510,514,518,522,526,530,534,538,542,546,550,554,558,562,567,571,575,580,584,588,592],{"title":10,"path":500,"stem":504,"access":12,"icon":505},"recipes\u002Findex","i-lucide-play",{"title":507,"path":508,"stem":509,"access":12},"Accounting app","\u002Frecipes\u002Faccounting-app","recipes\u002Faccounting-app",{"title":511,"path":512,"stem":513,"access":12},"Analytics app","\u002Frecipes\u002Fanalytics-app","recipes\u002Fanalytics-app",{"title":515,"path":516,"stem":517,"access":12},"Attestation verifier","\u002Frecipes\u002Fattestation-verifier","recipes\u002Fattestation-verifier",{"title":519,"path":520,"stem":521,"access":12},"AWS-KMS attestation","\u002Frecipes\u002Faws-kms-pdf-attestation","recipes\u002Faws-kms-pdf-attestation",{"title":523,"path":524,"stem":525,"access":12},"Browser durability","\u002Frecipes\u002Fbrowser-durability","recipes\u002Fbrowser-durability",{"title":527,"path":528,"stem":529,"access":12},"Production cloud store","\u002Frecipes\u002Fcloud-store","recipes\u002Fcloud-store",{"title":531,"path":532,"stem":533,"access":12},"Compose your own setup","\u002Frecipes\u002Fcompose-your-own","recipes\u002Fcompose-your-own",{"title":535,"path":536,"stem":537,"access":12},"Confidential HR records","\u002Frecipes\u002Fconfidential-hr","recipes\u002Fconfidential-hr",{"title":539,"path":540,"stem":541,"access":12},"Composing an echo secret","\u002Frecipes\u002Fecho-secret-enrollment","recipes\u002Fecho-secret-enrollment",{"title":543,"path":544,"stem":545,"access":12},"Email archive","\u002Frecipes\u002Femail-archive","recipes\u002Femail-archive",{"title":547,"path":548,"stem":549,"access":12},"Email archive — threads & revisions","\u002Frecipes\u002Femail-archive-threads-revisions","recipes\u002Femail-archive-threads-revisions",{"title":551,"path":552,"stem":553,"access":12},"Export & portability","\u002Frecipes\u002Fexport-portability","recipes\u002Fexport-portability",{"title":555,"path":556,"stem":557,"access":12},"Passwordless OIDC (AWS Cognito)","\u002Frecipes\u002Fpasswordless-oidc","recipes\u002Fpasswordless-oidc",{"title":559,"path":560,"stem":561,"access":12},"Personal notebook","\u002Frecipes\u002Fpersonal-notebook","recipes\u002Fpersonal-notebook",{"title":563,"path":564,"stem":565,"access":12,"icon":566},"Playgrounds","\u002Frecipes\u002Fplaygrounds","recipes\u002Fplaygrounds","i-lucide-gamepad-2",{"title":568,"path":569,"stem":570,"access":12},"React invoice app","\u002Frecipes\u002Freact-invoices","recipes\u002Freact-invoices",{"title":572,"path":573,"stem":574,"access":12},"Collaborative app","\u002Frecipes\u002Frealtime-crdt-app","recipes\u002Frealtime-crdt-app",{"title":576,"path":577,"stem":578,"access":12,"icon":579},"Run the showcases","\u002Frecipes\u002Frun-the-showcases","recipes\u002Frun-the-showcases","i-lucide-flask-conical",{"title":581,"path":582,"stem":583,"access":12},"Search & RAG","\u002Frecipes\u002Fsearch-rag","recipes\u002Fsearch-rag",{"title":585,"path":586,"stem":587,"access":12},"Team vault topology","\u002Frecipes\u002Fteam-vault-topology","recipes\u002Fteam-vault-topology",{"title":589,"path":590,"stem":591,"access":12},"Unlock ceremonies","\u002Frecipes\u002Funlock-ceremonies","recipes\u002Funlock-ceremonies",{"title":593,"path":594,"stem":595,"access":12},"User preferences","\u002Frecipes\u002Fuser-preferences","recipes\u002Fuser-preferences",{"title":597,"path":598,"stem":599,"children":600},"Services","\u002Fservices","services",[601,604,608,612,616,620,624,628,632,636,640,644,648,652,656,660,664,668,672,676,680,684,688,692,696,700,704,710,714,718,722,726,730,734,738,742,746,750,755,759,763,767,771,775,779,783,787,791,795,799,803,807,811,815,819,823,827,831,835,839,843,847,851,855,859,863,867,871,875,879,883,887,891,895,899],{"title":10,"path":598,"stem":602,"access":12,"icon":603},"services\u002Findex","i-lucide-layers",{"title":605,"path":606,"stem":607,"access":12},"archive","\u002Fservices\u002Farchive","services\u002Farchive",{"title":609,"path":610,"stem":611,"access":12},"attestation","\u002Fservices\u002Fattestation","services\u002Fattestation",{"title":613,"path":614,"stem":615,"access":12},"auth-introspection","\u002Fservices\u002Fauth-introspection","services\u002Fauth-introspection",{"title":617,"path":618,"stem":619,"access":12},"auth-landscape","\u002Fservices\u002Fauth-landscape","services\u002Fauth-landscape",{"title":621,"path":622,"stem":623,"access":12},"blobs","\u002Fservices\u002Fblobs","services\u002Fblobs",{"title":625,"path":626,"stem":627,"access":12},"broker","\u002Fservices\u002Fbroker","services\u002Fbroker",{"title":629,"path":630,"stem":631,"access":12},"bundle","\u002Fservices\u002Fbundle","services\u002Fbundle",{"title":633,"path":634,"stem":635,"access":12},"classified","\u002Fservices\u002Fclassified","services\u002Fclassified",{"title":637,"path":638,"stem":639,"access":12},"computed","\u002Fservices\u002Fcomputed","services\u002Fcomputed",{"title":641,"path":642,"stem":643,"access":12},"consent","\u002Fservices\u002Fconsent","services\u002Fconsent",{"title":645,"path":646,"stem":647,"access":12},"cover","\u002Fservices\u002Fcover","services\u002Fcover",{"title":649,"path":650,"stem":651,"access":12},"coverage","\u002Fservices\u002Fcoverage","services\u002Fcoverage",{"title":653,"path":654,"stem":655,"access":12},"crdt","\u002Fservices\u002Fcrdt","services\u002Fcrdt",{"title":657,"path":658,"stem":659,"access":12},"cross-join","\u002Fservices\u002Fcross-join","services\u002Fcross-join",{"title":661,"path":662,"stem":663,"access":12},"custody","\u002Fservices\u002Fcustody","services\u002Fcustody",{"title":665,"path":666,"stem":667,"access":12},"derivations","\u002Fservices\u002Fderivations","services\u002Fderivations",{"title":669,"path":670,"stem":671,"access":12},"directory","\u002Fservices\u002Fdirectory","services\u002Fdirectory",{"title":673,"path":674,"stem":675,"access":12},"search — AI","\u002Fservices\u002Fembeddings","services\u002Fembeddings",{"title":677,"path":678,"stem":679,"access":12},"Field metadata","\u002Fservices\u002Ffield-metadata","services\u002Ffield-metadata",{"title":681,"path":682,"stem":683,"access":12},"Foreign refs","\u002Fservices\u002Fforeign-refs","services\u002Fforeign-refs",{"title":685,"path":686,"stem":687,"access":12},"forget","\u002Fservices\u002Fforget","services\u002Fforget",{"title":689,"path":690,"stem":691,"access":12},"governance","\u002Fservices\u002Fgovernance","services\u002Fgovernance",{"title":693,"path":694,"stem":695,"access":12},"guards","\u002Fservices\u002Fguards","services\u002Fguards",{"title":697,"path":698,"stem":699,"access":12},"history","\u002Fservices\u002Fhistory","services\u002Fhistory",{"title":701,"path":702,"stem":703,"access":12},"i18n","\u002Fservices\u002Fi18n","services\u002Fi18n",{"title":705,"path":706,"stem":707,"children":708,"access":12},"indexing","\u002Fservices\u002Findexing","services\u002Findexing",[709],{"title":705,"path":706,"stem":707,"access":12},{"title":711,"path":712,"stem":713,"access":12},"introspection","\u002Fservices\u002Fintrospection","services\u002Fintrospection",{"title":715,"path":716,"stem":717,"access":12},"joins","\u002Fservices\u002Fjoins","services\u002Fjoins",{"title":719,"path":720,"stem":721,"access":12},"lazy","\u002Fservices\u002Flazy","services\u002Flazy",{"title":723,"path":724,"stem":725,"access":12},"links","\u002Fservices\u002Flinks","services\u002Flinks",{"title":727,"path":728,"stem":729,"access":12},"live","\u002Fservices\u002Flive","services\u002Flive",{"title":731,"path":732,"stem":733,"access":12},"lookup","\u002Fservices\u002Flookup","services\u002Flookup",{"title":735,"path":736,"stem":737,"access":12},"manifest","\u002Fservices\u002Fmanifest","services\u002Fmanifest",{"title":739,"path":740,"stem":741,"access":12},"materialized-views","\u002Fservices\u002Fmaterialized-views","services\u002Fmaterialized-views",{"title":743,"path":744,"stem":745,"access":12},"Metadata ladder","\u002Fservices\u002Fmetadata-ladder","services\u002Fmetadata-ladder",{"title":747,"path":748,"stem":749,"access":12},"Metadata riders","\u002Fservices\u002Fmetadata-riders","services\u002Fmetadata-riders",{"title":751,"path":752,"stem":753,"access":12,"badge":754},"metrics","\u002Fservices\u002Fmetrics","services\u002Fmetrics","Planned",{"title":756,"path":757,"stem":758,"access":12,"badge":754},"migrations","\u002Fservices\u002Fmigrations","services\u002Fmigrations",{"title":760,"path":761,"stem":762,"access":12},"money","\u002Fservices\u002Fmoney","services\u002Fmoney",{"title":764,"path":765,"stem":766,"access":12},"numbering","\u002Fservices\u002Fnumbering","services\u002Fnumbering",{"title":768,"path":769,"stem":770,"access":12},"overlay-views","\u002Fservices\u002Foverlay-views","services\u002Foverlay-views",{"title":772,"path":773,"stem":774,"access":12,"badge":754},"partitioning","\u002Fservices\u002Fpartitioning","services\u002Fpartitioning",{"title":776,"path":777,"stem":778,"access":12},"periods","\u002Fservices\u002Fperiods","services\u002Fperiods",{"title":780,"path":781,"stem":782,"access":12},"persisted-schemas","\u002Fservices\u002Fpersisted-schemas","services\u002Fpersisted-schemas",{"title":784,"path":785,"stem":786,"access":12},"plaintext-bypass","\u002Fservices\u002Fplaintext-bypass","services\u002Fplaintext-bypass",{"title":788,"path":789,"stem":790,"access":12},"pod-redirect","\u002Fservices\u002Fpod-redirect","services\u002Fpod-redirect",{"title":792,"path":793,"stem":794,"access":12},"pod-signature","\u002Fservices\u002Fpod-signature","services\u002Fpod-signature",{"title":796,"path":797,"stem":798,"access":12},"policy","\u002Fservices\u002Fpolicy","services\u002Fpolicy",{"title":800,"path":801,"stem":802,"access":12},"portability","\u002Fservices\u002Fportability","services\u002Fportability",{"title":804,"path":805,"stem":806,"access":12},"reduce","\u002Fservices\u002Freduce","services\u002Freduce",{"title":808,"path":809,"stem":810,"access":12},"routing","\u002Fservices\u002Frouting","services\u002Frouting",{"title":812,"path":813,"stem":814,"access":12},"satellites","\u002Fservices\u002Fsatellites","services\u002Fsatellites",{"title":816,"path":817,"stem":818,"access":12},"schema-identifiers","\u002Fservices\u002Fschema-identifiers","services\u002Fschema-identifiers",{"title":820,"path":821,"stem":822,"access":12},"schema-update","\u002Fservices\u002Fschema-update","services\u002Fschema-update",{"title":824,"path":825,"stem":826,"access":12},"sealed-record","\u002Fservices\u002Fsealed-record","services\u002Fsealed-record",{"title":828,"path":829,"stem":830,"access":12},"sealing provider id","\u002Fservices\u002Fsealing-pid-stability","services\u002Fsealing-pid-stability",{"title":832,"path":833,"stem":834,"access":12},"search — full-text","\u002Fservices\u002Fsearch","services\u002Fsearch",{"title":836,"path":837,"stem":838,"access":12},"sequence","\u002Fservices\u002Fsequence","services\u002Fsequence",{"title":840,"path":841,"stem":842,"access":12},"session","\u002Fservices\u002Fsession","services\u002Fsession",{"title":844,"path":845,"stem":846,"access":12},"session-tiers","\u002Fservices\u002Fsession-tiers","services\u002Fsession-tiers",{"title":848,"path":849,"stem":850,"access":12},"shadow","\u002Fservices\u002Fshadow","services\u002Fshadow",{"title":852,"path":853,"stem":854,"access":12},"share-link","\u002Fservices\u002Fshare-link","services\u002Fshare-link",{"title":856,"path":857,"stem":858,"access":12},"snapshots","\u002Fservices\u002Fsnapshots","services\u002Fsnapshots",{"title":860,"path":861,"stem":862,"access":12},"store capabilities","\u002Fservices\u002Fstorage-capability-matrix","services\u002Fstorage-capability-matrix",{"title":864,"path":865,"stem":866,"access":12},"sync","\u002Fservices\u002Fsync","services\u002Fsync",{"title":868,"path":869,"stem":870,"access":12},"team","\u002Fservices\u002Fteam","services\u002Fteam",{"title":872,"path":873,"stem":874,"access":12},"tiers","\u002Fservices\u002Ftiers","services\u002Ftiers",{"title":876,"path":877,"stem":878,"access":12},"transactions","\u002Fservices\u002Ftransactions","services\u002Ftransactions",{"title":880,"path":881,"stem":882,"access":12},"partitions","\u002Fservices\u002Ftransferable-partitions","services\u002Ftransferable-partitions",{"title":884,"path":885,"stem":886,"access":12},"user-envelope","\u002Fservices\u002Fuser-envelope","services\u002Fuser-envelope",{"title":888,"path":889,"stem":890,"access":12,"badge":754},"validation","\u002Fservices\u002Fvalidation","services\u002Fvalidation",{"title":892,"path":893,"stem":894,"access":12},"vault-head","\u002Fservices\u002Fvault-head","services\u002Fvault-head",{"title":896,"path":897,"stem":898,"access":12},"via","\u002Fservices\u002Fvia","services\u002Fvia",{"title":900,"path":901,"stem":902,"access":12},"withdrawal","\u002Fservices\u002Fwithdrawal","services\u002Fwithdrawal",{"title":904,"path":905,"stem":906,"children":907},"Start","\u002Fstart","start",[908,911,915,919,923],{"title":10,"path":905,"stem":909,"access":12,"icon":910},"start\u002Findex","i-lucide-flag",{"title":912,"path":913,"stem":914,"access":12},"Install","\u002Fstart\u002Finstall","start\u002F1.install",{"title":916,"path":917,"stem":918,"access":12},"Your first vault","\u002Fstart\u002Ffirst-vault","start\u002F2.first-vault",{"title":920,"path":921,"stem":922,"access":12},"Your first service","\u002Fstart\u002Ffirst-service","start\u002F3.first-service",{"title":924,"path":925,"stem":926,"access":12},"See the ciphertext","\u002Fstart\u002Fsee-the-ciphertext","start\u002F4.see-the-ciphertext",{"id":928,"title":661,"access":12,"apiToc":929,"body":930,"category":3830,"description":3831,"extension":3832,"meta":3833,"navigation":3830,"nest":3834,"path":662,"seo":3835,"sinceVersion":3830,"status":3836,"stem":663,"subtitle":3830,"tier":3837,"tocExternal":3830,"__hash__":3838},"docs\u002Fservices\u002Fcustody.md",false,{"type":931,"value":932,"toc":3808},"minimark",[933,936,940,945,954,957,996,1007,1011,1025,1029,1059,1445,1458,1462,1467,1477,1629,1718,1737,1741,1744,2179,2202,2206,2209,2252,2256,2265,2541,2648,2651,2710,2713,2891,2906,2910,2915,2933,2942,2948,2986,3003,3015,3146,3152,3184,3193,3235,3241,3272,3275,3280,3363,3369,3437,3441,3494,3500,3587,3591,3645,3649,3679,3683,3752,3756,3804],[934,935,661],"h1",{"id":661},[937,938],"service-meta",{":rows":939},"[{\"label\":\"Subpath\",\"value\":\"`@noy-db\u002Fhub` (root export — no dedicated subpath)\"},{\"label\":\"Factory\",\"value\":\"`withCustody()`\"},{\"label\":\"Layer\",\"value\":\"`with-party`\"}]",[941,942,944],"h2",{"id":943},"what-it-does","What it does",[946,947,948,949,953],"p",{},"Suppose a service firm runs a client's data day-to-day, but the client must remain the only\ntrue owner — the firm must never be able to lock the client out, hand access to a third\nparty, or walk away with the data. The custody service encodes that arrangement\ncryptographically inside a vault (an encrypted, per-tenant data space — see\n",[950,951,952],"a",{"href":48},"Core 01 — Vault and collections",").",[946,955,956],{},"It rests on two pieces:",[958,959,960,977],"ul",{},[961,962,963,972,973,976],"li",{},[964,965,966,967,971],"strong",{},"The ",[968,969,970],"code",{},"custodian"," role."," A custodian's keyring (the per-user file of wrapped encryption\nkeys — see ",[950,974,975],{"href":54},"Core 06 — Permissions and keyring",") carries\nevery collection's data-encryption key, so the custodian reads and writes everything.\nBut it is structurally denied every ownership-level act: it cannot grant or revoke users,\ncannot rotate keys, and cannot extract-and-sever the vault.",[961,978,979,982,983,987,988,991,992,995],{},[964,980,981],{},"The Deed."," A ",[984,985,986],"em",{},"Deed vault"," is one whose owner never authenticates: the owner secret\nis minted machine-side as random bytes and sealed under a ",[968,989,990],{},"NoydbSealer"," the\n",[984,993,994],{},"client"," controls (their KMS, their keychain — never the operating firm's infrastructure).\nThat sealing boundary is the ownership anchor: only the holder of the provider can ever\nre-derive the owner key, and there is deliberately no firm-controlled fallback.",[946,997,998,999,1002,1003,1006],{},"The third piece connects them: ",[968,1000,1001],{},"vault.custody.liberate()"," is the one audited route by which\na custodian becomes an owner — for example at the end of the service contract. Liberation\nmints a ",[984,1004,1005],{},"distinct new owner"," from the custodian's keys and records the act in the vault's\nlifecycle ledger; it never unseals or impersonates the original sealed owner.",[941,1008,1010],{"id":1009},"prerequisites","Prerequisites",[958,1012,1013],{},[961,1014,1015,1020,1021,1024],{},[964,1016,1017],{},[968,1018,1019],{},"teamStrategy: withTeam()"," — custody rides the multi-user keyring engine (grant\u002Frevoke), so the team strategy must be passed alongside ",[968,1022,1023],{},"withCustody()",".",[941,1026,1028],{"id":1027},"opt-in","Opt in",[946,1030,1031,1032,1035,1036,1039,1040,1043,1044,1047,1048,1051,1052,1055,1056,1058],{},"Pass ",[968,1033,1034],{},"custodyStrategy: withCustody()"," to ",[968,1037,1038],{},"createNoydb",". The custody gates ",[964,1041,1042],{},"fail closed",":\n",[968,1045,1046],{},"grant-custodian"," and ",[968,1049,1050],{},"liberate-vault"," are denied unless the vault policy explicitly\nenables them (revocation runs through the shared ",[968,1053,1054],{},"revoke-user"," gate). See\n",[950,1057,844],{"href":845}," for the policy-gates DSL.",[1060,1061,1066],"pre",{"className":1062,"code":1063,"language":1064,"meta":1065,"style":1065},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createNoydb, withCustody, withTeam } from '@noy-db\u002Fhub'\nimport { toMemory } from '@noy-db\u002Fto-memory'\n\nconst store = toMemory()  \u002F\u002F any NoydbStore works\n\nconst db = await createNoydb({\n  store,\n  user: 'owner-01',\n  secret: 'owner-secret-long',\n  teamStrategy: withTeam(),        \u002F\u002F multi-user keyrings (grant\u002Frevoke engine)\n  custodyStrategy: withCustody(),  \u002F\u002F the custody surface\n  policy: {\n    gates: {\n      'grant-custodian': { enabled: true, minTier: 1 },\n      'liberate-vault':  { enabled: true, minTier: 1 },\n      'revoke-user':     { enabled: true, minTier: 1 },\n    },\n  },\n})\n\nconst vault = await db.openVault('acme')\n","ts","",[968,1067,1068,1112,1133,1140,1163,1168,1189,1198,1218,1235,1253,1270,1281,1291,1328,1358,1388,1394,1400,1409,1414],{"__ignoreMap":1065},[1069,1070,1073,1077,1081,1085,1088,1091,1093,1096,1099,1102,1105,1109],"span",{"class":1071,"line":1072},"line",1,[1069,1074,1076],{"class":1075},"s7zQu","import",[1069,1078,1080],{"class":1079},"sMK4o"," {",[1069,1082,1084],{"class":1083},"sTEyZ"," createNoydb",[1069,1086,1087],{"class":1079},",",[1069,1089,1090],{"class":1083}," withCustody",[1069,1092,1087],{"class":1079},[1069,1094,1095],{"class":1083}," withTeam",[1069,1097,1098],{"class":1079}," }",[1069,1100,1101],{"class":1075}," from",[1069,1103,1104],{"class":1079}," '",[1069,1106,1108],{"class":1107},"sfazB","@noy-db\u002Fhub",[1069,1110,1111],{"class":1079},"'\n",[1069,1113,1115,1117,1119,1122,1124,1126,1128,1131],{"class":1071,"line":1114},2,[1069,1116,1076],{"class":1075},[1069,1118,1080],{"class":1079},[1069,1120,1121],{"class":1083}," toMemory",[1069,1123,1098],{"class":1079},[1069,1125,1101],{"class":1075},[1069,1127,1104],{"class":1079},[1069,1129,1130],{"class":1107},"@noy-db\u002Fto-memory",[1069,1132,1111],{"class":1079},[1069,1134,1136],{"class":1071,"line":1135},3,[1069,1137,1139],{"emptyLinePlaceholder":1138},true,"\n",[1069,1141,1143,1147,1150,1153,1156,1159],{"class":1071,"line":1142},4,[1069,1144,1146],{"class":1145},"spNyl","const",[1069,1148,1149],{"class":1083}," store ",[1069,1151,1152],{"class":1079},"=",[1069,1154,1121],{"class":1155},"s2Zo4",[1069,1157,1158],{"class":1083},"()  ",[1069,1160,1162],{"class":1161},"sHwdD","\u002F\u002F any NoydbStore works\n",[1069,1164,1166],{"class":1071,"line":1165},5,[1069,1167,1139],{"emptyLinePlaceholder":1138},[1069,1169,1171,1173,1176,1178,1181,1183,1186],{"class":1071,"line":1170},6,[1069,1172,1146],{"class":1145},[1069,1174,1175],{"class":1083}," db ",[1069,1177,1152],{"class":1079},[1069,1179,1180],{"class":1075}," await",[1069,1182,1084],{"class":1155},[1069,1184,1185],{"class":1083},"(",[1069,1187,1188],{"class":1079},"{\n",[1069,1190,1192,1195],{"class":1071,"line":1191},7,[1069,1193,1194],{"class":1083},"  store",[1069,1196,1197],{"class":1079},",\n",[1069,1199,1201,1205,1208,1210,1213,1216],{"class":1071,"line":1200},8,[1069,1202,1204],{"class":1203},"swJcz","  user",[1069,1206,1207],{"class":1079},":",[1069,1209,1104],{"class":1079},[1069,1211,1212],{"class":1107},"owner-01",[1069,1214,1215],{"class":1079},"'",[1069,1217,1197],{"class":1079},[1069,1219,1221,1224,1226,1228,1231,1233],{"class":1071,"line":1220},9,[1069,1222,1223],{"class":1203},"  secret",[1069,1225,1207],{"class":1079},[1069,1227,1104],{"class":1079},[1069,1229,1230],{"class":1107},"owner-secret-long",[1069,1232,1215],{"class":1079},[1069,1234,1197],{"class":1079},[1069,1236,1238,1241,1243,1245,1248,1250],{"class":1071,"line":1237},10,[1069,1239,1240],{"class":1203},"  teamStrategy",[1069,1242,1207],{"class":1079},[1069,1244,1095],{"class":1155},[1069,1246,1247],{"class":1083},"()",[1069,1249,1087],{"class":1079},[1069,1251,1252],{"class":1161},"        \u002F\u002F multi-user keyrings (grant\u002Frevoke engine)\n",[1069,1254,1256,1259,1261,1263,1265,1267],{"class":1071,"line":1255},11,[1069,1257,1258],{"class":1203},"  custodyStrategy",[1069,1260,1207],{"class":1079},[1069,1262,1090],{"class":1155},[1069,1264,1247],{"class":1083},[1069,1266,1087],{"class":1079},[1069,1268,1269],{"class":1161},"  \u002F\u002F the custody surface\n",[1069,1271,1273,1276,1278],{"class":1071,"line":1272},12,[1069,1274,1275],{"class":1203},"  policy",[1069,1277,1207],{"class":1079},[1069,1279,1280],{"class":1079}," {\n",[1069,1282,1284,1287,1289],{"class":1071,"line":1283},13,[1069,1285,1286],{"class":1203},"    gates",[1069,1288,1207],{"class":1079},[1069,1290,1280],{"class":1079},[1069,1292,1294,1297,1299,1301,1303,1305,1308,1310,1314,1316,1319,1321,1325],{"class":1071,"line":1293},14,[1069,1295,1296],{"class":1079},"      '",[1069,1298,1046],{"class":1203},[1069,1300,1215],{"class":1079},[1069,1302,1207],{"class":1079},[1069,1304,1080],{"class":1079},[1069,1306,1307],{"class":1203}," enabled",[1069,1309,1207],{"class":1079},[1069,1311,1313],{"class":1312},"sfNiH"," true",[1069,1315,1087],{"class":1079},[1069,1317,1318],{"class":1203}," minTier",[1069,1320,1207],{"class":1079},[1069,1322,1324],{"class":1323},"sbssI"," 1",[1069,1326,1327],{"class":1079}," },\n",[1069,1329,1331,1333,1335,1337,1339,1342,1344,1346,1348,1350,1352,1354,1356],{"class":1071,"line":1330},15,[1069,1332,1296],{"class":1079},[1069,1334,1050],{"class":1203},[1069,1336,1215],{"class":1079},[1069,1338,1207],{"class":1079},[1069,1340,1341],{"class":1079},"  {",[1069,1343,1307],{"class":1203},[1069,1345,1207],{"class":1079},[1069,1347,1313],{"class":1312},[1069,1349,1087],{"class":1079},[1069,1351,1318],{"class":1203},[1069,1353,1207],{"class":1079},[1069,1355,1324],{"class":1323},[1069,1357,1327],{"class":1079},[1069,1359,1361,1363,1365,1367,1369,1372,1374,1376,1378,1380,1382,1384,1386],{"class":1071,"line":1360},16,[1069,1362,1296],{"class":1079},[1069,1364,1054],{"class":1203},[1069,1366,1215],{"class":1079},[1069,1368,1207],{"class":1079},[1069,1370,1371],{"class":1079},"     {",[1069,1373,1307],{"class":1203},[1069,1375,1207],{"class":1079},[1069,1377,1313],{"class":1312},[1069,1379,1087],{"class":1079},[1069,1381,1318],{"class":1203},[1069,1383,1207],{"class":1079},[1069,1385,1324],{"class":1323},[1069,1387,1327],{"class":1079},[1069,1389,1391],{"class":1071,"line":1390},17,[1069,1392,1393],{"class":1079},"    },\n",[1069,1395,1397],{"class":1071,"line":1396},18,[1069,1398,1399],{"class":1079},"  },\n",[1069,1401,1403,1406],{"class":1071,"line":1402},19,[1069,1404,1405],{"class":1079},"}",[1069,1407,1408],{"class":1083},")\n",[1069,1410,1412],{"class":1071,"line":1411},20,[1069,1413,1139],{"emptyLinePlaceholder":1138},[1069,1415,1417,1419,1422,1424,1426,1429,1431,1434,1436,1438,1441,1443],{"class":1071,"line":1416},21,[1069,1418,1146],{"class":1145},[1069,1420,1421],{"class":1083}," vault ",[1069,1423,1152],{"class":1079},[1069,1425,1180],{"class":1075},[1069,1427,1428],{"class":1083}," db",[1069,1430,1024],{"class":1079},[1069,1432,1433],{"class":1155},"openVault",[1069,1435,1185],{"class":1083},[1069,1437,1215],{"class":1079},[1069,1439,1440],{"class":1107},"acme",[1069,1442,1215],{"class":1079},[1069,1444,1408],{"class":1083},[946,1446,1447,1448,1450,1451,1454,1455,1457],{},"Without ",[968,1449,1023],{},", every custody operation throws ",[968,1452,1453],{},"CustodyNotEnabledError",". The\nheavy liberation engine is loaded via dynamic import inside ",[968,1456,1023],{},", so none of it\nships in your bundle until you opt in.",[941,1459,1461],{"id":1460},"usage","Usage",[1463,1464,1466],"h3",{"id":1465},"provision-a-deed-vault-sealed-owner","Provision a Deed vault (sealed owner)",[946,1468,1469,1472,1473,1476],{},[968,1470,1471],{},"createDeedOwner"," is a store-level function (it mints the vault's very first owner, so\nthere is no vault instance yet). It generates a random owner secret, seals it under\nthe client-held provider, writes the owner keyring, and stamps a plaintext ",[968,1474,1475],{},"_meta\u002Fdeed","\nmarker:",[1060,1478,1480],{"className":1062,"code":1479,"language":1064,"meta":1065,"style":1065},"import { createDeedOwner, loadDeedMarker, MemorySealer } from '@noy-db\u002Fhub'\n\n\u002F\u002F Held by the CLIENT — their KMS or keychain, never the operating firm's infra.\n\u002F\u002F MemorySealer is the in-memory stand-in for tests and examples;\n\u002F\u002F production providers ship as separate packages.\nconst sealing = new MemorySealer({ id: 'client-kms' })\n\nawait createDeedOwner(store, 'acme', 'owner-01', sealing)\n\nconst marker = await loadDeedMarker(store, 'acme')\n",[968,1481,1482,1511,1515,1520,1525,1530,1565,1569,1600,1604],{"__ignoreMap":1065},[1069,1483,1484,1486,1488,1491,1493,1496,1498,1501,1503,1505,1507,1509],{"class":1071,"line":1072},[1069,1485,1076],{"class":1075},[1069,1487,1080],{"class":1079},[1069,1489,1490],{"class":1083}," createDeedOwner",[1069,1492,1087],{"class":1079},[1069,1494,1495],{"class":1083}," loadDeedMarker",[1069,1497,1087],{"class":1079},[1069,1499,1500],{"class":1083}," MemorySealer",[1069,1502,1098],{"class":1079},[1069,1504,1101],{"class":1075},[1069,1506,1104],{"class":1079},[1069,1508,1108],{"class":1107},[1069,1510,1111],{"class":1079},[1069,1512,1513],{"class":1071,"line":1114},[1069,1514,1139],{"emptyLinePlaceholder":1138},[1069,1516,1517],{"class":1071,"line":1135},[1069,1518,1519],{"class":1161},"\u002F\u002F Held by the CLIENT — their KMS or keychain, never the operating firm's infra.\n",[1069,1521,1522],{"class":1071,"line":1142},[1069,1523,1524],{"class":1161},"\u002F\u002F MemorySealer is the in-memory stand-in for tests and examples;\n",[1069,1526,1527],{"class":1071,"line":1165},[1069,1528,1529],{"class":1161},"\u002F\u002F production providers ship as separate packages.\n",[1069,1531,1532,1534,1537,1539,1542,1544,1546,1549,1552,1554,1556,1559,1561,1563],{"class":1071,"line":1170},[1069,1533,1146],{"class":1145},[1069,1535,1536],{"class":1083}," sealing ",[1069,1538,1152],{"class":1079},[1069,1540,1541],{"class":1079}," new",[1069,1543,1500],{"class":1155},[1069,1545,1185],{"class":1083},[1069,1547,1548],{"class":1079},"{",[1069,1550,1551],{"class":1203}," id",[1069,1553,1207],{"class":1079},[1069,1555,1104],{"class":1079},[1069,1557,1558],{"class":1107},"client-kms",[1069,1560,1215],{"class":1079},[1069,1562,1098],{"class":1079},[1069,1564,1408],{"class":1083},[1069,1566,1567],{"class":1071,"line":1191},[1069,1568,1139],{"emptyLinePlaceholder":1138},[1069,1570,1571,1574,1576,1579,1581,1583,1585,1587,1589,1591,1593,1595,1597],{"class":1071,"line":1200},[1069,1572,1573],{"class":1075},"await",[1069,1575,1490],{"class":1155},[1069,1577,1578],{"class":1083},"(store",[1069,1580,1087],{"class":1079},[1069,1582,1104],{"class":1079},[1069,1584,1440],{"class":1107},[1069,1586,1215],{"class":1079},[1069,1588,1087],{"class":1079},[1069,1590,1104],{"class":1079},[1069,1592,1212],{"class":1107},[1069,1594,1215],{"class":1079},[1069,1596,1087],{"class":1079},[1069,1598,1599],{"class":1083}," sealing)\n",[1069,1601,1602],{"class":1071,"line":1220},[1069,1603,1139],{"emptyLinePlaceholder":1138},[1069,1605,1606,1608,1611,1613,1615,1617,1619,1621,1623,1625,1627],{"class":1071,"line":1237},[1069,1607,1146],{"class":1145},[1069,1609,1610],{"class":1083}," marker ",[1069,1612,1152],{"class":1079},[1069,1614,1180],{"class":1075},[1069,1616,1495],{"class":1155},[1069,1618,1578],{"class":1083},[1069,1620,1087],{"class":1079},[1069,1622,1104],{"class":1079},[1069,1624,1440],{"class":1107},[1069,1626,1215],{"class":1079},[1069,1628,1408],{"class":1083},[1060,1630,1633],{"className":1631,"code":1632,"language":141,"meta":1065,"style":1065},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"ownerUserId\": \"owner-01\",\n  \"sealedUnder\": \"client-kms\",\n  \"latent\": true,\n  \"issuedAt\": \"2026-07-08T09:14:03.412Z\"\n}\n",[968,1634,1635,1639,1661,1680,1694,1713],{"__ignoreMap":1065},[1069,1636,1637],{"class":1071,"line":1072},[1069,1638,1188],{"class":1079},[1069,1640,1641,1644,1647,1650,1652,1655,1657,1659],{"class":1071,"line":1114},[1069,1642,1643],{"class":1079},"  \"",[1069,1645,1646],{"class":1145},"ownerUserId",[1069,1648,1649],{"class":1079},"\"",[1069,1651,1207],{"class":1079},[1069,1653,1654],{"class":1079}," \"",[1069,1656,1212],{"class":1107},[1069,1658,1649],{"class":1079},[1069,1660,1197],{"class":1079},[1069,1662,1663,1665,1668,1670,1672,1674,1676,1678],{"class":1071,"line":1135},[1069,1664,1643],{"class":1079},[1069,1666,1667],{"class":1145},"sealedUnder",[1069,1669,1649],{"class":1079},[1069,1671,1207],{"class":1079},[1069,1673,1654],{"class":1079},[1069,1675,1558],{"class":1107},[1069,1677,1649],{"class":1079},[1069,1679,1197],{"class":1079},[1069,1681,1682,1684,1687,1689,1691],{"class":1071,"line":1142},[1069,1683,1643],{"class":1079},[1069,1685,1686],{"class":1145},"latent",[1069,1688,1649],{"class":1079},[1069,1690,1207],{"class":1079},[1069,1692,1693],{"class":1079}," true,\n",[1069,1695,1696,1698,1701,1703,1705,1707,1710],{"class":1071,"line":1165},[1069,1697,1643],{"class":1079},[1069,1699,1700],{"class":1145},"issuedAt",[1069,1702,1649],{"class":1079},[1069,1704,1207],{"class":1079},[1069,1706,1654],{"class":1079},[1069,1708,1709],{"class":1107},"2026-07-08T09:14:03.412Z",[1069,1711,1712],{"class":1079},"\"\n",[1069,1714,1715],{"class":1071,"line":1170},[1069,1716,1717],{"class":1079},"}\n",[946,1719,1720,1721,1724,1725,1727,1728,1730,1731,1734,1735,953],{},"The marker is deliberately ",[964,1722,1723],{},"plaintext",": an auditor (or the custodian) must be able to see\n\"this is a Deed vault, owner is ",[968,1726,1212],{},", sealed under ",[968,1729,1558],{},"\" without any key. It\ncarries no secret material — only the owner ",[984,1732,1733],{},"credential"," is sealed. The latent owner never\ntypes a secret; re-entry goes through the same sealing provider (managed-secret\nmode — see ",[950,1736,844],{"href":845},[1463,1738,1740],{"id":1739},"grant-a-custodian-full-operation-no-ownership","Grant a custodian — full operation, no ownership",[946,1742,1743],{},"Only the owner can mint a custodian (an admin caller is denied). The custodian receives a\nkeyring wrapping every collection key:",[1060,1745,1747],{"className":1062,"code":1746,"language":1064,"meta":1065,"style":1065},"await vault.custody.grantCustodian({\n  userId: 'firm-01',\n  displayName: 'Operating firm',\n  secret: 'firm-pass-long',\n})\n\n\u002F\u002F The custodian opens the vault and operates every collection…\nconst firmDb = await createNoydb({\n  store, user: 'firm-01', secret: 'firm-pass-long', teamStrategy: withTeam(),\n})\nconst firmVault = await firmDb.openVault('acme')\n\nawait firmVault.collection('invoices').get('inv-001')\n\u002F\u002F → { id: 'inv-001', amount: 5000, status: 'draft' }\nawait firmVault.collection('invoices').put('inv-002', { id: 'inv-002', amount: 1200, status: 'sent' })\n\u002F\u002F → ok — full read\u002Fwrite on every collection\n\n\u002F\u002F …but every ownership-level act is denied:\nawait firmDb.grant('acme', { userId: 'mole-01', displayName: 'Mole', role: 'admin', secret: 'mole-pass-long' })\n\u002F\u002F → throws PermissionDeniedError   (cannot widen the principal set)\nawait firmDb.rotate('acme', [])\n\u002F\u002F → throws PermissionDeniedError   (re-key is an owner-only meta-capability)\n",[968,1748,1749,1769,1785,1801,1816,1822,1826,1831,1848,1891,1897,1925,1929,1969,1974,2050,2055,2059,2064,2144,2149,2173],{"__ignoreMap":1065},[1069,1750,1751,1753,1756,1758,1760,1762,1765,1767],{"class":1071,"line":1072},[1069,1752,1573],{"class":1075},[1069,1754,1755],{"class":1083}," vault",[1069,1757,1024],{"class":1079},[1069,1759,661],{"class":1083},[1069,1761,1024],{"class":1079},[1069,1763,1764],{"class":1155},"grantCustodian",[1069,1766,1185],{"class":1083},[1069,1768,1188],{"class":1079},[1069,1770,1771,1774,1776,1778,1781,1783],{"class":1071,"line":1114},[1069,1772,1773],{"class":1203},"  userId",[1069,1775,1207],{"class":1079},[1069,1777,1104],{"class":1079},[1069,1779,1780],{"class":1107},"firm-01",[1069,1782,1215],{"class":1079},[1069,1784,1197],{"class":1079},[1069,1786,1787,1790,1792,1794,1797,1799],{"class":1071,"line":1135},[1069,1788,1789],{"class":1203},"  displayName",[1069,1791,1207],{"class":1079},[1069,1793,1104],{"class":1079},[1069,1795,1796],{"class":1107},"Operating firm",[1069,1798,1215],{"class":1079},[1069,1800,1197],{"class":1079},[1069,1802,1803,1805,1807,1809,1812,1814],{"class":1071,"line":1142},[1069,1804,1223],{"class":1203},[1069,1806,1207],{"class":1079},[1069,1808,1104],{"class":1079},[1069,1810,1811],{"class":1107},"firm-pass-long",[1069,1813,1215],{"class":1079},[1069,1815,1197],{"class":1079},[1069,1817,1818,1820],{"class":1071,"line":1165},[1069,1819,1405],{"class":1079},[1069,1821,1408],{"class":1083},[1069,1823,1824],{"class":1071,"line":1170},[1069,1825,1139],{"emptyLinePlaceholder":1138},[1069,1827,1828],{"class":1071,"line":1191},[1069,1829,1830],{"class":1161},"\u002F\u002F The custodian opens the vault and operates every collection…\n",[1069,1832,1833,1835,1838,1840,1842,1844,1846],{"class":1071,"line":1200},[1069,1834,1146],{"class":1145},[1069,1836,1837],{"class":1083}," firmDb ",[1069,1839,1152],{"class":1079},[1069,1841,1180],{"class":1075},[1069,1843,1084],{"class":1155},[1069,1845,1185],{"class":1083},[1069,1847,1188],{"class":1079},[1069,1849,1850,1852,1854,1857,1859,1861,1863,1865,1867,1870,1872,1874,1876,1878,1880,1883,1885,1887,1889],{"class":1071,"line":1220},[1069,1851,1194],{"class":1083},[1069,1853,1087],{"class":1079},[1069,1855,1856],{"class":1203}," user",[1069,1858,1207],{"class":1079},[1069,1860,1104],{"class":1079},[1069,1862,1780],{"class":1107},[1069,1864,1215],{"class":1079},[1069,1866,1087],{"class":1079},[1069,1868,1869],{"class":1203}," secret",[1069,1871,1207],{"class":1079},[1069,1873,1104],{"class":1079},[1069,1875,1811],{"class":1107},[1069,1877,1215],{"class":1079},[1069,1879,1087],{"class":1079},[1069,1881,1882],{"class":1203}," teamStrategy",[1069,1884,1207],{"class":1079},[1069,1886,1095],{"class":1155},[1069,1888,1247],{"class":1083},[1069,1890,1197],{"class":1079},[1069,1892,1893,1895],{"class":1071,"line":1237},[1069,1894,1405],{"class":1079},[1069,1896,1408],{"class":1083},[1069,1898,1899,1901,1904,1906,1908,1911,1913,1915,1917,1919,1921,1923],{"class":1071,"line":1255},[1069,1900,1146],{"class":1145},[1069,1902,1903],{"class":1083}," firmVault ",[1069,1905,1152],{"class":1079},[1069,1907,1180],{"class":1075},[1069,1909,1910],{"class":1083}," firmDb",[1069,1912,1024],{"class":1079},[1069,1914,1433],{"class":1155},[1069,1916,1185],{"class":1083},[1069,1918,1215],{"class":1079},[1069,1920,1440],{"class":1107},[1069,1922,1215],{"class":1079},[1069,1924,1408],{"class":1083},[1069,1926,1927],{"class":1071,"line":1272},[1069,1928,1139],{"emptyLinePlaceholder":1138},[1069,1930,1931,1933,1936,1938,1941,1943,1945,1948,1950,1953,1955,1958,1960,1962,1965,1967],{"class":1071,"line":1283},[1069,1932,1573],{"class":1075},[1069,1934,1935],{"class":1083}," firmVault",[1069,1937,1024],{"class":1079},[1069,1939,1940],{"class":1155},"collection",[1069,1942,1185],{"class":1083},[1069,1944,1215],{"class":1079},[1069,1946,1947],{"class":1107},"invoices",[1069,1949,1215],{"class":1079},[1069,1951,1952],{"class":1083},")",[1069,1954,1024],{"class":1079},[1069,1956,1957],{"class":1155},"get",[1069,1959,1185],{"class":1083},[1069,1961,1215],{"class":1079},[1069,1963,1964],{"class":1107},"inv-001",[1069,1966,1215],{"class":1079},[1069,1968,1408],{"class":1083},[1069,1970,1971],{"class":1071,"line":1293},[1069,1972,1973],{"class":1161},"\u002F\u002F → { id: 'inv-001', amount: 5000, status: 'draft' }\n",[1069,1975,1976,1978,1980,1982,1984,1986,1988,1990,1992,1994,1996,1999,2001,2003,2006,2008,2010,2012,2014,2016,2018,2020,2022,2024,2027,2029,2032,2034,2037,2039,2041,2044,2046,2048],{"class":1071,"line":1330},[1069,1977,1573],{"class":1075},[1069,1979,1935],{"class":1083},[1069,1981,1024],{"class":1079},[1069,1983,1940],{"class":1155},[1069,1985,1185],{"class":1083},[1069,1987,1215],{"class":1079},[1069,1989,1947],{"class":1107},[1069,1991,1215],{"class":1079},[1069,1993,1952],{"class":1083},[1069,1995,1024],{"class":1079},[1069,1997,1998],{"class":1155},"put",[1069,2000,1185],{"class":1083},[1069,2002,1215],{"class":1079},[1069,2004,2005],{"class":1107},"inv-002",[1069,2007,1215],{"class":1079},[1069,2009,1087],{"class":1079},[1069,2011,1080],{"class":1079},[1069,2013,1551],{"class":1203},[1069,2015,1207],{"class":1079},[1069,2017,1104],{"class":1079},[1069,2019,2005],{"class":1107},[1069,2021,1215],{"class":1079},[1069,2023,1087],{"class":1079},[1069,2025,2026],{"class":1203}," amount",[1069,2028,1207],{"class":1079},[1069,2030,2031],{"class":1323}," 1200",[1069,2033,1087],{"class":1079},[1069,2035,2036],{"class":1203}," status",[1069,2038,1207],{"class":1079},[1069,2040,1104],{"class":1079},[1069,2042,2043],{"class":1107},"sent",[1069,2045,1215],{"class":1079},[1069,2047,1098],{"class":1079},[1069,2049,1408],{"class":1083},[1069,2051,2052],{"class":1071,"line":1360},[1069,2053,2054],{"class":1161},"\u002F\u002F → ok — full read\u002Fwrite on every collection\n",[1069,2056,2057],{"class":1071,"line":1390},[1069,2058,1139],{"emptyLinePlaceholder":1138},[1069,2060,2061],{"class":1071,"line":1396},[1069,2062,2063],{"class":1161},"\u002F\u002F …but every ownership-level act is denied:\n",[1069,2065,2066,2068,2070,2072,2075,2077,2079,2081,2083,2085,2087,2090,2092,2094,2097,2099,2101,2104,2106,2108,2111,2113,2115,2118,2120,2122,2125,2127,2129,2131,2133,2135,2138,2140,2142],{"class":1071,"line":1402},[1069,2067,1573],{"class":1075},[1069,2069,1910],{"class":1083},[1069,2071,1024],{"class":1079},[1069,2073,2074],{"class":1155},"grant",[1069,2076,1185],{"class":1083},[1069,2078,1215],{"class":1079},[1069,2080,1440],{"class":1107},[1069,2082,1215],{"class":1079},[1069,2084,1087],{"class":1079},[1069,2086,1080],{"class":1079},[1069,2088,2089],{"class":1203}," userId",[1069,2091,1207],{"class":1079},[1069,2093,1104],{"class":1079},[1069,2095,2096],{"class":1107},"mole-01",[1069,2098,1215],{"class":1079},[1069,2100,1087],{"class":1079},[1069,2102,2103],{"class":1203}," displayName",[1069,2105,1207],{"class":1079},[1069,2107,1104],{"class":1079},[1069,2109,2110],{"class":1107},"Mole",[1069,2112,1215],{"class":1079},[1069,2114,1087],{"class":1079},[1069,2116,2117],{"class":1203}," role",[1069,2119,1207],{"class":1079},[1069,2121,1104],{"class":1079},[1069,2123,2124],{"class":1107},"admin",[1069,2126,1215],{"class":1079},[1069,2128,1087],{"class":1079},[1069,2130,1869],{"class":1203},[1069,2132,1207],{"class":1079},[1069,2134,1104],{"class":1079},[1069,2136,2137],{"class":1107},"mole-pass-long",[1069,2139,1215],{"class":1079},[1069,2141,1098],{"class":1079},[1069,2143,1408],{"class":1083},[1069,2145,2146],{"class":1071,"line":1411},[1069,2147,2148],{"class":1161},"\u002F\u002F → throws PermissionDeniedError   (cannot widen the principal set)\n",[1069,2150,2151,2153,2155,2157,2160,2162,2164,2166,2168,2170],{"class":1071,"line":1416},[1069,2152,1573],{"class":1075},[1069,2154,1910],{"class":1083},[1069,2156,1024],{"class":1079},[1069,2158,2159],{"class":1155},"rotate",[1069,2161,1185],{"class":1083},[1069,2163,1215],{"class":1079},[1069,2165,1440],{"class":1107},[1069,2167,1215],{"class":1079},[1069,2169,1087],{"class":1079},[1069,2171,2172],{"class":1083}," [])\n",[1069,2174,2176],{"class":1071,"line":2175},22,[1069,2177,2178],{"class":1161},"\u002F\u002F → throws PermissionDeniedError   (re-key is an owner-only meta-capability)\n",[946,2180,2181,2182,2185,2186,2189,2190,2193,2194,2197,2198,2201],{},"A custodian is also denied destructive self-service withdrawal\n(",[968,2183,2184],{},"vault.user.unilateralWithdrawal"," throws ",[968,2187,2188],{},"ReadOnlyError",") and partition extraction\n(extract-and-sever throws ",[968,2191,2192],{},"PartitionExtractionError"," — see\n",[950,2195,2196],{"href":881},"transferable-partitions","). The only way a custodian\never gains ownership is the audited ",[968,2199,2200],{},"liberate()"," ceremony below.",[1463,2203,2205],{"id":2204},"revoke-a-custodian","Revoke a custodian",[946,2207,2208],{},"The owner removes the custodian at any time — without the custodian's cooperation:",[1060,2210,2212],{"className":1062,"code":2211,"language":1064,"meta":1065,"style":1065},"await vault.custody.revokeCustodian({ userId: 'firm-01' })\n\u002F\u002F firm-01's keyring is deleted; a fresh open as firm-01 now fails\n",[968,2213,2214,2247],{"__ignoreMap":1065},[1069,2215,2216,2218,2220,2222,2224,2226,2229,2231,2233,2235,2237,2239,2241,2243,2245],{"class":1071,"line":1072},[1069,2217,1573],{"class":1075},[1069,2219,1755],{"class":1083},[1069,2221,1024],{"class":1079},[1069,2223,661],{"class":1083},[1069,2225,1024],{"class":1079},[1069,2227,2228],{"class":1155},"revokeCustodian",[1069,2230,1185],{"class":1083},[1069,2232,1548],{"class":1079},[1069,2234,2089],{"class":1203},[1069,2236,1207],{"class":1079},[1069,2238,1104],{"class":1079},[1069,2240,1780],{"class":1107},[1069,2242,1215],{"class":1079},[1069,2244,1098],{"class":1079},[1069,2246,1408],{"class":1083},[1069,2248,2249],{"class":1071,"line":1114},[1069,2250,2251],{"class":1161},"\u002F\u002F firm-01's keyring is deleted; a fresh open as firm-01 now fails\n",[1463,2253,2255],{"id":2254},"liberate-the-audited-ownership-claim","Liberate — the audited ownership claim",[946,2257,2258,2259,2261,2262,2264],{},"When ownership legitimately passes to the operating party (say, a contractual handover),\nthe ",[964,2260,970],{}," claims the vault. Liberation is gated (",[968,2263,1050],{},", fail-closed),\ncustodian-only (an owner or admin caller is denied), and audited:",[1060,2266,2268],{"className":1062,"code":2267,"language":1064,"meta":1065,"style":1065},"import { withHistory } from '@noy-db\u002Fhub\u002Fhistory'\n\nconst firmDb = await createNoydb({\n  store, user: 'firm-01', secret: 'firm-pass-long',\n  teamStrategy: withTeam(),\n  custodyStrategy: withCustody(),\n  historyStrategy: withHistory(),   \u002F\u002F so the ceremony lands in the lifecycle ledger\n  policy: { gates: { 'liberate-vault': { enabled: true, minTier: 1 } } },\n})\nconst firmVault = await firmDb.openVault('acme')\n\nconst result = await firmVault.custody.liberate({\n  newOwnerId: 'firm-owner-01',\n  newOwnerSecret: 'firm-owner-pass-long',\n  legalBasis: 'contractual-handover',\n})\n",[968,2269,2270,2290,2294,2310,2340,2352,2364,2380,2425,2431,2457,2461,2487,2503,2519,2535],{"__ignoreMap":1065},[1069,2271,2272,2274,2276,2279,2281,2283,2285,2288],{"class":1071,"line":1072},[1069,2273,1076],{"class":1075},[1069,2275,1080],{"class":1079},[1069,2277,2278],{"class":1083}," withHistory",[1069,2280,1098],{"class":1079},[1069,2282,1101],{"class":1075},[1069,2284,1104],{"class":1079},[1069,2286,2287],{"class":1107},"@noy-db\u002Fhub\u002Fhistory",[1069,2289,1111],{"class":1079},[1069,2291,2292],{"class":1071,"line":1114},[1069,2293,1139],{"emptyLinePlaceholder":1138},[1069,2295,2296,2298,2300,2302,2304,2306,2308],{"class":1071,"line":1135},[1069,2297,1146],{"class":1145},[1069,2299,1837],{"class":1083},[1069,2301,1152],{"class":1079},[1069,2303,1180],{"class":1075},[1069,2305,1084],{"class":1155},[1069,2307,1185],{"class":1083},[1069,2309,1188],{"class":1079},[1069,2311,2312,2314,2316,2318,2320,2322,2324,2326,2328,2330,2332,2334,2336,2338],{"class":1071,"line":1142},[1069,2313,1194],{"class":1083},[1069,2315,1087],{"class":1079},[1069,2317,1856],{"class":1203},[1069,2319,1207],{"class":1079},[1069,2321,1104],{"class":1079},[1069,2323,1780],{"class":1107},[1069,2325,1215],{"class":1079},[1069,2327,1087],{"class":1079},[1069,2329,1869],{"class":1203},[1069,2331,1207],{"class":1079},[1069,2333,1104],{"class":1079},[1069,2335,1811],{"class":1107},[1069,2337,1215],{"class":1079},[1069,2339,1197],{"class":1079},[1069,2341,2342,2344,2346,2348,2350],{"class":1071,"line":1165},[1069,2343,1240],{"class":1203},[1069,2345,1207],{"class":1079},[1069,2347,1095],{"class":1155},[1069,2349,1247],{"class":1083},[1069,2351,1197],{"class":1079},[1069,2353,2354,2356,2358,2360,2362],{"class":1071,"line":1170},[1069,2355,1258],{"class":1203},[1069,2357,1207],{"class":1079},[1069,2359,1090],{"class":1155},[1069,2361,1247],{"class":1083},[1069,2363,1197],{"class":1079},[1069,2365,2366,2369,2371,2373,2375,2377],{"class":1071,"line":1191},[1069,2367,2368],{"class":1203},"  historyStrategy",[1069,2370,1207],{"class":1079},[1069,2372,2278],{"class":1155},[1069,2374,1247],{"class":1083},[1069,2376,1087],{"class":1079},[1069,2378,2379],{"class":1161},"   \u002F\u002F so the ceremony lands in the lifecycle ledger\n",[1069,2381,2382,2384,2386,2388,2391,2393,2395,2397,2399,2401,2403,2405,2407,2409,2411,2413,2415,2417,2419,2421,2423],{"class":1071,"line":1200},[1069,2383,1275],{"class":1203},[1069,2385,1207],{"class":1079},[1069,2387,1080],{"class":1079},[1069,2389,2390],{"class":1203}," gates",[1069,2392,1207],{"class":1079},[1069,2394,1080],{"class":1079},[1069,2396,1104],{"class":1079},[1069,2398,1050],{"class":1203},[1069,2400,1215],{"class":1079},[1069,2402,1207],{"class":1079},[1069,2404,1080],{"class":1079},[1069,2406,1307],{"class":1203},[1069,2408,1207],{"class":1079},[1069,2410,1313],{"class":1312},[1069,2412,1087],{"class":1079},[1069,2414,1318],{"class":1203},[1069,2416,1207],{"class":1079},[1069,2418,1324],{"class":1323},[1069,2420,1098],{"class":1079},[1069,2422,1098],{"class":1079},[1069,2424,1327],{"class":1079},[1069,2426,2427,2429],{"class":1071,"line":1220},[1069,2428,1405],{"class":1079},[1069,2430,1408],{"class":1083},[1069,2432,2433,2435,2437,2439,2441,2443,2445,2447,2449,2451,2453,2455],{"class":1071,"line":1237},[1069,2434,1146],{"class":1145},[1069,2436,1903],{"class":1083},[1069,2438,1152],{"class":1079},[1069,2440,1180],{"class":1075},[1069,2442,1910],{"class":1083},[1069,2444,1024],{"class":1079},[1069,2446,1433],{"class":1155},[1069,2448,1185],{"class":1083},[1069,2450,1215],{"class":1079},[1069,2452,1440],{"class":1107},[1069,2454,1215],{"class":1079},[1069,2456,1408],{"class":1083},[1069,2458,2459],{"class":1071,"line":1255},[1069,2460,1139],{"emptyLinePlaceholder":1138},[1069,2462,2463,2465,2468,2470,2472,2474,2476,2478,2480,2483,2485],{"class":1071,"line":1272},[1069,2464,1146],{"class":1145},[1069,2466,2467],{"class":1083}," result ",[1069,2469,1152],{"class":1079},[1069,2471,1180],{"class":1075},[1069,2473,1935],{"class":1083},[1069,2475,1024],{"class":1079},[1069,2477,661],{"class":1083},[1069,2479,1024],{"class":1079},[1069,2481,2482],{"class":1155},"liberate",[1069,2484,1185],{"class":1083},[1069,2486,1188],{"class":1079},[1069,2488,2489,2492,2494,2496,2499,2501],{"class":1071,"line":1283},[1069,2490,2491],{"class":1203},"  newOwnerId",[1069,2493,1207],{"class":1079},[1069,2495,1104],{"class":1079},[1069,2497,2498],{"class":1107},"firm-owner-01",[1069,2500,1215],{"class":1079},[1069,2502,1197],{"class":1079},[1069,2504,2505,2508,2510,2512,2515,2517],{"class":1071,"line":1293},[1069,2506,2507],{"class":1203},"  newOwnerSecret",[1069,2509,1207],{"class":1079},[1069,2511,1104],{"class":1079},[1069,2513,2514],{"class":1107},"firm-owner-pass-long",[1069,2516,1215],{"class":1079},[1069,2518,1197],{"class":1079},[1069,2520,2521,2524,2526,2528,2531,2533],{"class":1071,"line":1330},[1069,2522,2523],{"class":1203},"  legalBasis",[1069,2525,1207],{"class":1079},[1069,2527,1104],{"class":1079},[1069,2529,2530],{"class":1107},"contractual-handover",[1069,2532,1215],{"class":1079},[1069,2534,1197],{"class":1079},[1069,2536,2537,2539],{"class":1071,"line":1360},[1069,2538,1405],{"class":1079},[1069,2540,1408],{"class":1083},[1060,2542,2544],{"className":1631,"code":2543,"language":141,"meta":1065,"style":1065},"{\n  \"snapshot\": {\n    \"withdrawalId\": \"01JZGJ3V9GQ2N9W3H4X5T6K7R8\",\n    \"sha256\": \"9f2c41a7c3e8d0b6f5a1e2d3c4b5a6978877665544332211ffeeddccbbaa0099\",\n    \"recordCount\": 3,\n    \"frozenAt\": \"2026-07-08T10:02:41.007Z\"\n  }\n}\n",[968,2545,2546,2550,2563,2585,2605,2621,2639,2644],{"__ignoreMap":1065},[1069,2547,2548],{"class":1071,"line":1072},[1069,2549,1188],{"class":1079},[1069,2551,2552,2554,2557,2559,2561],{"class":1071,"line":1114},[1069,2553,1643],{"class":1079},[1069,2555,2556],{"class":1145},"snapshot",[1069,2558,1649],{"class":1079},[1069,2560,1207],{"class":1079},[1069,2562,1280],{"class":1079},[1069,2564,2565,2568,2572,2574,2576,2578,2581,2583],{"class":1071,"line":1135},[1069,2566,2567],{"class":1079},"    \"",[1069,2569,2571],{"class":2570},"sBMFI","withdrawalId",[1069,2573,1649],{"class":1079},[1069,2575,1207],{"class":1079},[1069,2577,1654],{"class":1079},[1069,2579,2580],{"class":1107},"01JZGJ3V9GQ2N9W3H4X5T6K7R8",[1069,2582,1649],{"class":1079},[1069,2584,1197],{"class":1079},[1069,2586,2587,2589,2592,2594,2596,2598,2601,2603],{"class":1071,"line":1142},[1069,2588,2567],{"class":1079},[1069,2590,2591],{"class":2570},"sha256",[1069,2593,1649],{"class":1079},[1069,2595,1207],{"class":1079},[1069,2597,1654],{"class":1079},[1069,2599,2600],{"class":1107},"9f2c41a7c3e8d0b6f5a1e2d3c4b5a6978877665544332211ffeeddccbbaa0099",[1069,2602,1649],{"class":1079},[1069,2604,1197],{"class":1079},[1069,2606,2607,2609,2612,2614,2616,2619],{"class":1071,"line":1165},[1069,2608,2567],{"class":1079},[1069,2610,2611],{"class":2570},"recordCount",[1069,2613,1649],{"class":1079},[1069,2615,1207],{"class":1079},[1069,2617,2618],{"class":1323}," 3",[1069,2620,1197],{"class":1079},[1069,2622,2623,2625,2628,2630,2632,2634,2637],{"class":1071,"line":1170},[1069,2624,2567],{"class":1079},[1069,2626,2627],{"class":2570},"frozenAt",[1069,2629,1649],{"class":1079},[1069,2631,1207],{"class":1079},[1069,2633,1654],{"class":1079},[1069,2635,2636],{"class":1107},"2026-07-08T10:02:41.007Z",[1069,2638,1712],{"class":1079},[1069,2640,2641],{"class":1071,"line":1191},[1069,2642,2643],{"class":1079},"  }\n",[1069,2645,2646],{"class":1071,"line":1200},[1069,2647,1717],{"class":1079},[946,2649,2650],{},"The ceremony runs six steps, in order:",[2652,2653,2654,2660,2665,2676,2690,2700],"ol",{},[961,2655,2656,2657,2659],{},"Check the ",[968,2658,1050],{}," gate (fail-closed).",[961,2661,2662,2663,1024],{},"Verify the caller's role is ",[968,2664,970],{},[961,2666,2667,2668,2671,2672,2675],{},"Freeze a hash-pinned ",[964,2669,2670],{},"evidence snapshot"," of every operational collection — the live\nrecords are ",[984,2673,2674],{},"preserved",", not deleted: liberation transfers operational continuity.",[961,2677,2678,2679,2682,2683,2686,2687,1024],{},"Mint a ",[964,2680,2681],{},"new owner keyring"," for ",[968,2684,2685],{},"newOwnerId",", re-wrapping the custodian's collection\nkeys under a fresh key derived from ",[968,2688,2689],{},"newOwnerSecret",[961,2691,2692,2693,2696,2697,2699],{},"Append ",[968,2694,2695],{},"liberation-claimed:\u003CnewOwnerId>:\u003ClegalBasis>"," to the lifecycle ledger (skipped\nsilently if ",[950,2698,697],{"href":698}," is not enabled).",[961,2701,2702,2703,2706,2707,2709],{},"Stamp ",[968,2704,2705],{},"liberatedAt"," on the ",[968,2708,1475],{}," marker.",[946,2711,2712],{},"Afterwards the new owner is a fully independent principal and the data is intact:",[1060,2714,2716],{"className":1062,"code":2715,"language":1064,"meta":1065,"style":1065},"const entries = await firmVault.ledger().entries()\n\u002F\u002F → includes { op: 'lifecycle', actor: 'firm-owner-01',\n\u002F\u002F              reason: 'liberation-claimed:firm-owner-01:contractual-handover' }\n\nconst newOwnerDb = await createNoydb({\n  store, user: 'firm-owner-01', secret: 'firm-owner-pass-long', teamStrategy: withTeam(),\n})\nconst newOwnerVault = await newOwnerDb.openVault('acme')\nawait newOwnerVault.collection('invoices').get('inv-001')\n\u002F\u002F → { id: 'inv-001', amount: 5000, status: 'draft' }   (live data preserved)\n",[968,2717,2718,2746,2751,2756,2760,2777,2817,2823,2851,2886],{"__ignoreMap":1065},[1069,2719,2720,2722,2725,2727,2729,2731,2733,2736,2738,2740,2743],{"class":1071,"line":1072},[1069,2721,1146],{"class":1145},[1069,2723,2724],{"class":1083}," entries ",[1069,2726,1152],{"class":1079},[1069,2728,1180],{"class":1075},[1069,2730,1935],{"class":1083},[1069,2732,1024],{"class":1079},[1069,2734,2735],{"class":1155},"ledger",[1069,2737,1247],{"class":1083},[1069,2739,1024],{"class":1079},[1069,2741,2742],{"class":1155},"entries",[1069,2744,2745],{"class":1083},"()\n",[1069,2747,2748],{"class":1071,"line":1114},[1069,2749,2750],{"class":1161},"\u002F\u002F → includes { op: 'lifecycle', actor: 'firm-owner-01',\n",[1069,2752,2753],{"class":1071,"line":1135},[1069,2754,2755],{"class":1161},"\u002F\u002F              reason: 'liberation-claimed:firm-owner-01:contractual-handover' }\n",[1069,2757,2758],{"class":1071,"line":1142},[1069,2759,1139],{"emptyLinePlaceholder":1138},[1069,2761,2762,2764,2767,2769,2771,2773,2775],{"class":1071,"line":1165},[1069,2763,1146],{"class":1145},[1069,2765,2766],{"class":1083}," newOwnerDb ",[1069,2768,1152],{"class":1079},[1069,2770,1180],{"class":1075},[1069,2772,1084],{"class":1155},[1069,2774,1185],{"class":1083},[1069,2776,1188],{"class":1079},[1069,2778,2779,2781,2783,2785,2787,2789,2791,2793,2795,2797,2799,2801,2803,2805,2807,2809,2811,2813,2815],{"class":1071,"line":1170},[1069,2780,1194],{"class":1083},[1069,2782,1087],{"class":1079},[1069,2784,1856],{"class":1203},[1069,2786,1207],{"class":1079},[1069,2788,1104],{"class":1079},[1069,2790,2498],{"class":1107},[1069,2792,1215],{"class":1079},[1069,2794,1087],{"class":1079},[1069,2796,1869],{"class":1203},[1069,2798,1207],{"class":1079},[1069,2800,1104],{"class":1079},[1069,2802,2514],{"class":1107},[1069,2804,1215],{"class":1079},[1069,2806,1087],{"class":1079},[1069,2808,1882],{"class":1203},[1069,2810,1207],{"class":1079},[1069,2812,1095],{"class":1155},[1069,2814,1247],{"class":1083},[1069,2816,1197],{"class":1079},[1069,2818,2819,2821],{"class":1071,"line":1191},[1069,2820,1405],{"class":1079},[1069,2822,1408],{"class":1083},[1069,2824,2825,2827,2830,2832,2834,2837,2839,2841,2843,2845,2847,2849],{"class":1071,"line":1200},[1069,2826,1146],{"class":1145},[1069,2828,2829],{"class":1083}," newOwnerVault ",[1069,2831,1152],{"class":1079},[1069,2833,1180],{"class":1075},[1069,2835,2836],{"class":1083}," newOwnerDb",[1069,2838,1024],{"class":1079},[1069,2840,1433],{"class":1155},[1069,2842,1185],{"class":1083},[1069,2844,1215],{"class":1079},[1069,2846,1440],{"class":1107},[1069,2848,1215],{"class":1079},[1069,2850,1408],{"class":1083},[1069,2852,2853,2855,2858,2860,2862,2864,2866,2868,2870,2872,2874,2876,2878,2880,2882,2884],{"class":1071,"line":1220},[1069,2854,1573],{"class":1075},[1069,2856,2857],{"class":1083}," newOwnerVault",[1069,2859,1024],{"class":1079},[1069,2861,1940],{"class":1155},[1069,2863,1185],{"class":1083},[1069,2865,1215],{"class":1079},[1069,2867,1947],{"class":1107},[1069,2869,1215],{"class":1079},[1069,2871,1952],{"class":1083},[1069,2873,1024],{"class":1079},[1069,2875,1957],{"class":1155},[1069,2877,1185],{"class":1083},[1069,2879,1215],{"class":1079},[1069,2881,1964],{"class":1107},[1069,2883,1215],{"class":1079},[1069,2885,1408],{"class":1083},[1069,2887,2888],{"class":1071,"line":1237},[1069,2889,2890],{"class":1161},"\u002F\u002F → { id: 'inv-001', amount: 5000, status: 'draft' }   (live data preserved)\n",[946,2892,2893,2894,2897,2898,2901,2902,2905],{},"The original sealed-owner credential is ",[964,2895,2896],{},"never touched",": its keyring file remains, still\nsealed under the client's provider, now orphaned. Claiming ownership always produces a\n",[984,2899,2900],{},"different"," principal plus an audit trail — a custodian can never silently ",[984,2903,2904],{},"become"," the\nlatent owner.",[941,2907,2909],{"id":2908},"api-reference","API reference",[1463,2911,2913],{"id":2912},"withcustody",[968,2914,1023],{},[1060,2916,2918],{"className":1062,"code":2917,"language":1064,"meta":1065,"style":1065},"function withCustody(): CustodyStrategy\n",[968,2919,2920],{"__ignoreMap":1065},[1069,2921,2922,2925,2927,2930],{"class":1071,"line":1072},[1069,2923,2924],{"class":1145},"function",[1069,2926,1090],{"class":1155},[1069,2928,2929],{"class":1079},"():",[1069,2931,2932],{"class":2570}," CustodyStrategy\n",[946,2934,2935,2936,1035,2939,2941],{},"Builds the active custody strategy. Pass it as ",[968,2937,2938],{},"custodyStrategy",[968,2940,1038],{}," — this is\nthe only wiring step. Takes no options. The liberation engine is dynamically imported by\nthe strategy, keeping it out of the base bundle.",[1463,2943,2945],{"id":2944},"vaultcustodygrantcustodianoptions-factors",[968,2946,2947],{},"vault.custody.grantCustodian(options, factors?)",[1060,2949,2951],{"className":1062,"code":2950,"language":1064,"meta":1065,"style":1065},"vault.custody.grantCustodian(options: GrantCustodianOptions, factors?: FactorProofBundle): Promise\u003Cvoid>\n",[968,2952,2953],{"__ignoreMap":1065},[1069,2954,2955,2958,2960,2962,2964,2966,2969,2971,2974,2977,2980,2983],{"class":1071,"line":1072},[1069,2956,2957],{"class":1083},"vault",[1069,2959,1024],{"class":1079},[1069,2961,661],{"class":1083},[1069,2963,1024],{"class":1079},[1069,2965,1764],{"class":1155},[1069,2967,2968],{"class":1083},"(options: GrantCustodianOptions",[1069,2970,1087],{"class":1079},[1069,2972,2973],{"class":1083}," factors",[1069,2975,2976],{"class":1079},"?:",[1069,2978,2979],{"class":1083}," FactorProofBundle): ",[1069,2981,2982],{"class":2570},"Promise",[1069,2984,2985],{"class":1079},"\u003Cvoid>\n",[946,2987,2988,2989,2991,2992,2994,2995,2998,2999,3002],{},"Owner-only: mint a ",[968,2990,970],{},". Defended in depth — the ",[968,2993,1046],{}," gate (fail-closed)\n",[984,2996,2997],{},"and"," an explicit owner-role check, so a misconfigured gate can never widen who may grant.\nAlso available db-level as ",[968,3000,3001],{},"db.grantCustodian(vault, options, factors?)","; the vault method\ndelegates to it.",[946,3004,3005,3008,3009,3012,3013,1207],{},[968,3006,3007],{},"GrantCustodianOptions"," is ",[968,3010,3011],{},"GrantOptions"," with the role fixed to ",[968,3014,970],{},[3016,3017,3018,3034],"table",{},[3019,3020,3021],"thead",{},[3022,3023,3024,3028,3031],"tr",{},[3025,3026,3027],"th",{},"Field",[3025,3029,3030],{},"Type",[3025,3032,3033],{},"Purpose",[3035,3036,3037,3053,3067,3081,3096,3113,3131],"tbody",{},[3022,3038,3039,3045,3050],{},[3040,3041,3042],"td",{},[968,3043,3044],{},"userId",[3040,3046,3047],{},[968,3048,3049],{},"string",[3040,3051,3052],{},"The new custodian's principal id.",[3022,3054,3055,3060,3064],{},[3040,3056,3057],{},[968,3058,3059],{},"displayName",[3040,3061,3062],{},[968,3063,3049],{},[3040,3065,3066],{},"Human-readable name stored on the keyring.",[3022,3068,3069,3074,3078],{},[3040,3070,3071],{},[968,3072,3073],{},"secret",[3040,3075,3076],{},[968,3077,3049],{},[3040,3079,3080],{},"The custodian's secret (validated against the vault's secret policy).",[3022,3082,3083,3088,3093],{},[3040,3084,3085],{},[968,3086,3087],{},"permissions?",[3040,3089,3090],{},[968,3091,3092],{},"Permissions",[3040,3094,3095],{},"Optional per-collection permission map.",[3022,3097,3098,3107,3110],{},[3040,3099,3100,3103,3104],{},[968,3101,3102],{},"exportCapability?"," \u002F ",[968,3105,3106],{},"importCapability?",[3040,3108,3109],{},"—",[3040,3111,3112],{},"Optional format-export\u002Fimport capability grants (role-based defaults when omitted).",[3022,3114,3115,3120,3125],{},[3040,3116,3117],{},[968,3118,3119],{},"allowWeakSecret?",[3040,3121,3122],{},[968,3123,3124],{},"boolean",[3040,3126,3127,3128,1024],{},"Skip secret-strength validation. Default ",[968,3129,3130],{},"false",[3022,3132,3133,3138,3143],{},[3040,3134,3135],{},[968,3136,3137],{},"initialProfile?",[3040,3139,3140],{},[968,3141,3142],{},"unknown",[3040,3144,3145],{},"Bootstrap-only user-envelope payload for the new principal.",[1463,3147,3149],{"id":3148},"vaultcustodyrevokecustodianoptions-factors",[968,3150,3151],{},"vault.custody.revokeCustodian(options, factors?)",[1060,3153,3155],{"className":1062,"code":3154,"language":1064,"meta":1065,"style":1065},"vault.custody.revokeCustodian(options: RevokeOptions, factors?: FactorProofBundle): Promise\u003Cvoid>\n",[968,3156,3157],{"__ignoreMap":1065},[1069,3158,3159,3161,3163,3165,3167,3169,3172,3174,3176,3178,3180,3182],{"class":1071,"line":1072},[1069,3160,2957],{"class":1083},[1069,3162,1024],{"class":1079},[1069,3164,661],{"class":1083},[1069,3166,1024],{"class":1079},[1069,3168,2228],{"class":1155},[1069,3170,3171],{"class":1083},"(options: RevokeOptions",[1069,3173,1087],{"class":1079},[1069,3175,2973],{"class":1083},[1069,3177,2976],{"class":1079},[1069,3179,2979],{"class":1083},[1069,3181,2982],{"class":2570},[1069,3183,2985],{"class":1079},[946,3185,3186,3187,3189,3190,1024],{},"Owner-only: remove a custodian. Runs through the shared ",[968,3188,1054],{}," gate plus the same\nexplicit owner-role check — an admin cannot unwind a custodianship. Also available as\n",[968,3191,3192],{},"db.revokeCustodian(vault, options, factors?)",[3016,3194,3195,3205],{},[3019,3196,3197],{},[3022,3198,3199,3201,3203],{},[3025,3200,3027],{},[3025,3202,3030],{},[3025,3204,3033],{},[3035,3206,3207,3220],{},[3022,3208,3209,3213,3217],{},[3040,3210,3211],{},[968,3212,3044],{},[3040,3214,3215],{},[968,3216,3049],{},[3040,3218,3219],{},"The custodian to revoke.",[3022,3221,3222,3227,3232],{},[3040,3223,3224],{},[968,3225,3226],{},"cascade?",[3040,3228,3229],{},[968,3230,3231],{},"'strict' | 'warn'",[3040,3233,3234],{},"Admin-delegation cascade behavior; no effect for custodians (they can never grant, so they have no delegation subtree).",[1463,3236,3238],{"id":3237},"vaultcustodyliberateopts",[968,3239,3240],{},"vault.custody.liberate(opts)",[1060,3242,3244],{"className":1062,"code":3243,"language":1064,"meta":1065,"style":1065},"vault.custody.liberate(opts: LiberateOptions): Promise\u003CLiberateResult>\n",[968,3245,3246],{"__ignoreMap":1065},[1069,3247,3248,3250,3252,3254,3256,3258,3261,3263,3266,3269],{"class":1071,"line":1072},[1069,3249,2957],{"class":1083},[1069,3251,1024],{"class":1079},[1069,3253,661],{"class":1083},[1069,3255,1024],{"class":1079},[1069,3257,2482],{"class":1155},[1069,3259,3260],{"class":1083},"(opts: LiberateOptions): ",[1069,3262,2982],{"class":2570},[1069,3264,3265],{"class":1079},"\u003C",[1069,3267,3268],{"class":1083},"LiberateResult",[1069,3270,3271],{"class":1079},">\n",[946,3273,3274],{},"Custodian-only: the audited ownership claim over a Deed vault (ceremony above).",[946,3276,3277,1207],{},[968,3278,3279],{},"LiberateOptions",[3016,3281,3282,3292],{},[3019,3283,3284],{},[3022,3285,3286,3288,3290],{},[3025,3287,3027],{},[3025,3289,3030],{},[3025,3291,3033],{},[3035,3293,3294,3315,3328,3345],{},[3022,3295,3296,3300,3304],{},[3040,3297,3298],{},[968,3299,2685],{},[3040,3301,3302],{},[968,3303,3049],{},[3040,3305,3306,3307,3310,3311,3314],{},"Id of the new owner principal to mint. Must be a ",[964,3308,3309],{},"fresh"," id — a collision with any existing principal throws ",[968,3312,3313],{},"PermissionDeniedError"," before any side effect.",[3022,3316,3317,3321,3325],{},[3040,3318,3319],{},[968,3320,2689],{},[3040,3322,3323],{},[968,3324,3049],{},[3040,3326,3327],{},"Derives the new owner's key; the collection keys are re-wrapped under it.",[3022,3329,3330,3335,3339],{},[3040,3331,3332],{},[968,3333,3334],{},"legalBasis",[3040,3336,3337],{},[968,3338,3049],{},[3040,3340,3341,3342,953],{},"Recorded in the audit entry (e.g. ",[968,3343,3344],{},"'contractual-handover'",[3022,3346,3347,3352,3357],{},[3040,3348,3349],{},[968,3350,3351],{},"factors?",[3040,3353,3354],{},[968,3355,3356],{},"FactorProofBundle",[3040,3358,3359,3360,3362],{},"Proofs for the ",[968,3361,1050],{}," gate.",[946,3364,3365,3368],{},[968,3366,3367],{},"LiberateResult.snapshot"," is the hash-pinned pre-liberation evidence snapshot:",[3016,3370,3371,3382],{},[3019,3372,3373],{},[3022,3374,3375,3377,3379],{},[3025,3376,3027],{},[3025,3378,3030],{},[3025,3380,3381],{},"Meaning",[3035,3383,3384,3397,3410,3424],{},[3022,3385,3386,3390,3394],{},[3040,3387,3388],{},[968,3389,2571],{},[3040,3391,3392],{},[968,3393,3049],{},[3040,3395,3396],{},"Id of the frozen snapshot.",[3022,3398,3399,3403,3407],{},[3040,3400,3401],{},[968,3402,2591],{},[3040,3404,3405],{},[968,3406,3049],{},[3040,3408,3409],{},"Hex digest pinning the snapshot contents.",[3022,3411,3412,3416,3421],{},[3040,3413,3414],{},[968,3415,2611],{},[3040,3417,3418],{},[968,3419,3420],{},"number",[3040,3422,3423],{},"Records captured.",[3022,3425,3426,3430,3434],{},[3040,3427,3428],{},[968,3429,2627],{},[3040,3431,3432],{},[968,3433,3049],{},[3040,3435,3436],{},"ISO timestamp.",[1463,3438,3440],{"id":3439},"deed-helpers-root-exports","Deed helpers (root exports)",[958,3442,3443,3460,3473,3481],{},[961,3444,3445,3448,3449,3452,3453,3455,3456,3459],{},[968,3446,3447],{},"createDeedOwner(store, vault, ownerUserId, sealing)"," → ",[968,3450,3451],{},"Promise\u003CUnlockedKeyring>"," —\nprovision a sealed latent owner + the ",[968,3454,1475],{}," marker. Store-level by design: it\nmints the vault's first owner, so there is no vault instance (and no ",[968,3457,3458],{},"vault.custody",")\nyet.",[961,3461,3462,3448,3465,3468,3469,3472],{},[968,3463,3464],{},"loadDeedMarker(store, vault)",[968,3466,3467],{},"Promise\u003CDeedMarker | null>"," — read the plaintext\nmarker (",[968,3470,3471],{},"null"," for non-Deed vaults).",[961,3474,3475,3448,3478,1024],{},[968,3476,3477],{},"isDeedVault(store, vault)",[968,3479,3480],{},"Promise\u003Cboolean>",[961,3482,3483,3486,3487,3490,3491,1024],{},[968,3484,3485],{},"DEED_RECORD_ID"," — the reserved marker id under ",[968,3488,3489],{},"_meta",", ",[968,3492,3493],{},"'deed'",[946,3495,3496,3499],{},[968,3497,3498],{},"DeedMarker"," (plaintext, readable without unlocking):",[3016,3501,3502,3512],{},[3019,3503,3504],{},[3022,3505,3506,3508,3510],{},[3025,3507,3027],{},[3025,3509,3030],{},[3025,3511,3381],{},[3035,3513,3514,3527,3540,3557,3570],{},[3022,3515,3516,3520,3524],{},[3040,3517,3518],{},[968,3519,1646],{},[3040,3521,3522],{},[968,3523,3049],{},[3040,3525,3526],{},"The latent owner principal.",[3022,3528,3529,3533,3537],{},[3040,3530,3531],{},[968,3532,1667],{},[3040,3534,3535],{},[968,3536,3049],{},[3040,3538,3539],{},"Id of the sealing provider anchoring ownership.",[3022,3541,3542,3546,3551],{},[3040,3543,3544],{},[968,3545,1686],{},[3040,3547,3548],{},[968,3549,3550],{},"true",[3040,3552,3553,3554,3556],{},"Always ",[968,3555,3550],{}," for a Deed.",[3022,3558,3559,3563,3567],{},[3040,3560,3561],{},[968,3562,1700],{},[3040,3564,3565],{},[968,3566,3049],{},[3040,3568,3569],{},"ISO timestamp of provisioning.",[3022,3571,3572,3577,3581],{},[3040,3573,3574],{},[968,3575,3576],{},"liberatedAt?",[3040,3578,3579],{},[968,3580,3049],{},[3040,3582,3583,3584,3586],{},"Set by a completed ",[968,3585,2200],{},"; absent until then.",[1463,3588,3590],{"id":3589},"other-exports","Other exports",[958,3592,3593,3612,3620,3628],{},[961,3594,3595,3598,3599,3602,3603,3605,3606,3608,3609,3611],{},[968,3596,3597],{},"liberateVault(vault, opts)"," — the lower-level free function ",[968,3600,3601],{},"vault.custody.liberate","\ndelegates to. It has no ",[968,3604,1038],{}," instance to check opt-in against, so it is\nreachable without ",[968,3607,1023],{}," — but it still enforces the ",[968,3610,1050],{}," gate and\nthe custodian-only role check.",[961,3613,3614,3617,3618,1024],{},[968,3615,3616],{},"NO_CUSTODY"," — the default no-op strategy; every operation throws\n",[968,3619,1453],{},[961,3621,3622,3624,3625,3627],{},[968,3623,1453],{}," — thrown by every custody surface when ",[968,3626,1023],{}," was not\npassed.",[961,3629,3630,3631,3490,3634,3490,3637,3490,3639,1197,3641,3490,3643,1024],{},"Types: ",[968,3632,3633],{},"CustodyStrategy",[968,3635,3636],{},"CustodyHost",[968,3638,3007],{},[968,3640,3279],{},[968,3642,3268],{},[968,3644,3498],{},[941,3646,3648],{"id":3647},"behavior-when-not-opted-in","Behavior when NOT opted in",[958,3650,3651,3670,3673],{},[961,3652,3653,3103,3656,3103,3658,3660,3661,3103,3664,3667,3668,1024],{},[968,3654,3655],{},"vault.custody.grantCustodian",[968,3657,2228],{},[968,3659,2482],{}," — and the db-level\n",[968,3662,3663],{},"db.grantCustodian",[968,3665,3666],{},"db.revokeCustodian"," — all throw ",[968,3669,1453],{},[961,3671,3672],{},"Everything else on the vault works normally.",[961,3674,3675,3676,3678],{},"The liberation engine never loads: it is reached only through ",[968,3677,1023],{},"'s dynamic\nimport.",[941,3680,3682],{"id":3681},"limits-gotchas","Limits & gotchas",[958,3684,3685,3700,3706,3716,3726,3734,3746],{},[961,3686,3687,3690,3691,1047,3693,3695,3696,3699],{},[964,3688,3689],{},"The custody gates fail closed."," ",[968,3692,1046],{},[968,3694,1050],{}," are denied\nwhen absent from the vault policy — even for the right role. Enable them explicitly\n(and consider pinning ",[968,3697,3698],{},"minTier"," \u002F factor requirements for such ownership-level acts).",[961,3701,3702,3705],{},[964,3703,3704],{},"Role checks are structural, not just policy."," Owner-only (grant\u002Frevoke) and\ncustodian-only (liberate) are enforced by explicit keyring-role checks in addition to\nthe gates, so a permissive gate cannot widen who may act.",[961,3707,3708,3711,3712,3715],{},[964,3709,3710],{},"Liberation never unseals the original owner."," It mints a distinct principal; the old\nsealed credential stays orphaned in place. If you need the ",[984,3713,3714],{},"original"," owner back, go\nthrough the client's sealing provider — that is the only re-entry point, by design.",[961,3717,3718,3721,3722,1047,3724,1024],{},[964,3719,3720],{},"Liberation preserves live data."," The evidence snapshot is freeze-only; nothing is\ndelete-closured. For destructive exits, see the withdrawal flows on\n",[950,3723,884],{"href":885},[950,3725,900],{"href":901},[961,3727,3728,3733],{},[964,3729,3730,3732],{},[968,3731,2685],{}," must be fresh."," A collision with any existing principal aborts before\nany side effect — no orphan snapshot, no partial keyring overwrite.",[961,3735,3736,3741,3742,3745],{},[964,3737,3738,3739,1024],{},"The ledger entry needs ",[950,3740,697],{"href":698}," Without ",[968,3743,3744],{},"withHistory()",", step 5\nof the ceremony is a silent no-op. Enable history on any vault where liberation must be\nprovable after the fact.",[961,3747,3748,3751],{},[964,3749,3750],{},"The Deed marker is plaintext on purpose."," It is audit metadata (who the latent owner\nis, which provider seals them) and must stay readable without keys; it never carries\nsecret material.",[941,3753,3755],{"id":3754},"see-also","See also",[958,3757,3758,3768,3773,3778,3783,3788,3793],{},[961,3759,3760,3763,3764],{},[950,3761,3762],{"href":598},"Services overview"," · ",[950,3765,3767],{"href":3766},"\u002Forientation","Orientation map",[961,3769,3770,3772],{},[950,3771,868],{"href":869}," — roles, grant\u002Frevoke\u002Frotate; custody builds on the keyring model",[961,3774,3775,3777],{},[950,3776,844],{"href":845}," — the policy-gates DSL and managed-secret mode",[961,3779,3780,3782],{},[950,3781,697],{"href":698}," — the lifecycle ledger that records liberation",[961,3784,3785,3787],{},[950,3786,2196],{"href":881}," — extract-and-sever, the owner-only capability custodians are denied",[961,3789,3790,3792],{},[950,3791,975],{"href":54}," — keyrings, wrapped keys, roles",[961,3794,3795,3796,1024],{},"Proven by showcase ",[950,3797,3801],{"href":3798,"rel":3799},"https:\u002F\u002Fgithub.com\u002Fnoy-db\u002Fdocs\u002Fblob\u002Fmain\u002Fshowcases\u002Fsrc\u002F129-with-custody.showcase.test.ts",[3800],"nofollow",[968,3802,3803],{},"129-with-custody",[3805,3806,3807],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":1065,"searchDepth":1135,"depth":1135,"links":3809},[3810,3811,3812,3813,3819,3827,3828,3829],{"id":943,"depth":1114,"text":944},{"id":1009,"depth":1114,"text":1010},{"id":1027,"depth":1114,"text":1028},{"id":1460,"depth":1114,"text":1461,"children":3814},[3815,3816,3817,3818],{"id":1465,"depth":1135,"text":1466},{"id":1739,"depth":1135,"text":1740},{"id":2204,"depth":1135,"text":2205},{"id":2254,"depth":1135,"text":2255},{"id":2908,"depth":1114,"text":2909,"children":3820},[3821,3822,3823,3824,3825,3826],{"id":2912,"depth":1135,"text":1023},{"id":2944,"depth":1135,"text":2947},{"id":3148,"depth":1135,"text":3151},{"id":3237,"depth":1135,"text":3240},{"id":3439,"depth":1135,"text":3440},{"id":3589,"depth":1135,"text":3590},{"id":3647,"depth":1114,"text":3648},{"id":3681,"depth":1114,"text":3682},{"id":3754,"depth":1114,"text":3755},null,"Sovereign custody: `withCustody()` adds a custodian role that operates a vault fully but can never grant, revoke, rotate, or extract — plus `liberate()`.","md",{},"service",{"title":661,"description":3831},"stable","important","avXpFTHppB9jKqDmf8_n-F9Vw8SbahJuOvsvi8D8M8A",{"data":3840,"body":3841},{},{"type":3842,"children":3843},"root",[3844],{"type":3845,"tag":946,"props":3846,"children":3847},"element",{},[3848],{"type":3845,"tag":968,"props":3849,"children":3851},{"className":3850},[],[3852],{"type":3853,"value":3854},"text","with-party",{"data":3856,"body":3857},{},{"type":3842,"children":3858},[3859],{"type":3845,"tag":946,"props":3860,"children":3861},{},[3862,3867],{"type":3845,"tag":968,"props":3863,"children":3865},{"className":3864},[],[3866],{"type":3853,"value":1108},{"type":3853,"value":3868}," (root export — no dedicated subpath)",{"data":3870,"body":3871},{},{"type":3842,"children":3872},[3873],{"type":3845,"tag":946,"props":3874,"children":3875},{},[3876],{"type":3845,"tag":968,"props":3877,"children":3879},{"className":3878},[],[3880],{"type":3853,"value":1023},1791896591134]