What the SDK creates by default, and the three credentials that touch it
Your log store holds the bytes your evidence commits to. Sanning never reads
it, so its settings are yours to get right, and the SDK is built to tell you
when they are not.This page covers the bucket. For what the store contains and how a reader
resolves it, see Keep what you anchored.
Creates it with Object Lock enabled, versioning on, and a default retention rule. Nothing is printed: the happy path is not an incident
A bucket with no Object Lock
Names the property in a warning, and under refuse stops the write. It is not repaired, because S3 enables Object Lock only at bucket creation
A backend without Object Lock
Degrades with the reason named, never silently. Under refuse it creates nothing
It could not look
Reports unknown, and refuse treats that as a refusal
unknown is not off. A credential missing s3:GetObjectLockConfiguration,
or a 403 on HeadBucket, means the SDK cannot see the protection rather than
that there is none. A guard that stands down where it cannot look guards
nothing.Object Lock enabled is not the same as protected. With no default retention
rule, objects in a lock-enabled bucket carry no retention and delete like any
other, so that state is reported as unprotected, because it is. Setting
days: 0 is a legitimate choice for a customer applying per-object retention
themselves, and the readiness check says what it sees.
warn is the default and it is not a silent third outcome: the write goes
ahead and is announced with the property named. refuse is the posture for a
customer who would rather hold no evidence than hold evidence they cannot
defend.
Creates the bucket with its protection. A human or a CI job runs this once and
the agent never holds it. s3:CreateBucket is the permission that makes an
unprotected-bucket mistake permanent, so it does not belong in a long-lived
agent credential.
Set createBucket: false when a platform team or Terraform provisions the
bucket instead. The protection check still runs: turning off creation does
not turn off the reporting.
The second statement is wider than “adds objects and nothing else”, on
purpose. A credential that literally adds objects and nothing else cannot
run the readiness check at all: HeadBucket needs s3:ListBucket, and the
two protection reads need their own actions. Under it the SDK reports
unknown on every run, which is honest and useless, and under refuse it
would never write.The three added actions are bucket-configuration reads. They disclose no
object, no key and no byte; they answer only whether this bucket is versioned
and locked. Granting them is what makes the guarantee checkable by the party
who depends on it.To hold the literal minimum instead, set createBucket: false and
storeProtection: "warn", verify the bucket once with the provisioner
credential, and accept that the SDK will say it cannot see the protection.
That is the true statement, and the reason unknown is a state at all.
Note what no credential has: s3:DeleteObject. Nothing in this system
deletes evidence, so nothing that touches the bucket is granted the ability to.
Object Lock is the backstop for a credential that gets one anyway.
The store takes your own client, and an endpoint with path-style addressing
makes an S3-compatible backend behave like S3. Object Lock support differs
between backends and changes between their releases, so this page names none of
them.The SDK detects and reports, which is the only claim that survives a backend
changing under you. Run the readiness check against a real bucket on the
backend you intend to use, and read what it says before you rely on it.
checkProtection() in TypeScript, check_protection() in Python, returns
the verdict and writes nothing. It names no bucket
and no key, so it is safe to surface somewhere that must stay content-blind:
a health endpoint, a readiness probe, a dashboard tile.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Sanning","colors":{"primary":"#3457D5","light":"#7C97F0","dark":"#16181D"},"logo":{"light":"https://mintcdn.com/sanning/gnQDixfAYN05cK1Z/logo/sanning-lowercase-ink.svg?fit=max\u0026auto=format\u0026n=gnQDixfAYN05cK1Z\u0026q=85\u0026s=5d9db4102bd87669e7393535cc6a2178","dark":"https://mintcdn.com/sanning/gnQDixfAYN05cK1Z/logo/sanning-lowercase-paper.svg?fit=max\u0026auto=format\u0026n=gnQDixfAYN05cK1Z\u0026q=85\u0026s=74203eabf814af968d8f4d132756a61f"},"favicon":{"light":"https://mintcdn.com/sanning/gnQDixfAYN05cK1Z/favicon.svg?fit=max\u0026auto=format\u0026n=gnQDixfAYN05cK1Z\u0026q=85\u0026s=9bbe5953872396b2e26744d33ee2e888","dark":"https://mintcdn.com/sanning/_npmu_Lj5brPwC6e/favicon-midnight.svg?fit=max\u0026auto=format\u0026n=_npmu_Lj5brPwC6e\u0026q=85\u0026s=3ffb8fc50466389265d21830db06fdc2"},"appearance":{"default":"system","strict":false},"background":{"color":{"light":"#F5F5F2","dark":"#0E1118"}},"fonts":{"family":"Geist","weight":400,"source":"fonts/Geist-Variable.woff2","format":"woff2"},"styling":{"eyebrows":"section","codeblocks":"system","latex":false},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"sanning","hasAudioNarration":false,"actualSubdomain":"sanning","customDomains":["docs.sanning.io"],"gitSource":{"type":"github","owner":"sanning-io","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ad8e66407bd5e919ed36d96","collectionId":"05c27ae6-122c-4563-8ae9-a6294425f2f1","liveDeploymentHistoryId":"6ad8e66407bd5e919ed36d96","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ad8e66407bd5e919ed36d96","clientVersion":"0.0.3966","searchFilterCounts":[{"language":"default","tag":"Guides","count":11},{"language":"default","tag":"Reference","count":5},{"language":"default","tag":"Concepts","count":4},{"language":"default","tag":"Verify","count":3},{"language":"default","tag":"Getting started","count":2}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"privacy":{"consentBanner":{"enabled":true}},"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"guides/bucket","slug":"/guides/bucket","pageMetadata":{"title":"Set up the bucket","description":"What the SDK creates by default, and the three credentials that touch it","href":"/guides/bucket"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"What the SDK creates by default, and the three credentials that touch it\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,..._provideComponents(),...props.components},{CodeBlock,CodeGroup,Heading,Note,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!CodeGroup)_missingMdxReference(`CodeGroup`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Your log store holds the bytes your evidence commits to. Sanning never reads\nit, so its settings are yours to get right, and the SDK is built to tell you\nwhen they are not.`}),`\n`,_jsxs(_components.p,{children:[`This page covers the bucket. For what the store `,_jsx(_components.em,{children:`contains`}),` and how a reader\nresolves it, see `,_jsx(_components.a,{href:`/guides/log-store`,children:`Keep what you anchored`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`what-the-sdk-does-on-first-use`,children:`What the SDK does on first use`}),`\n`,_jsx(_components.p,{children:`Before it writes a byte, the store checks the bucket once. There are two\nacceptable outcomes and a third the check exists to prevent.`}),`\n`,_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`TypeScript`,numberOfLines:`8`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`8`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`S3ObjectStore`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` } `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"@sanning/anchor-s3\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` objects`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` new`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` S3ObjectStore`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` bucket:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"evidence-claims\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` storeProtection:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"refuse\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// default \"warn\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` createBucket:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// default true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` objectLock:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`mode:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"GOVERNANCE\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`days:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 365`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`]})})}),_jsx(CodeBlock,{filename:`Python`,numberOfLines:`9`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`9`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` sanning_anchor.s3 `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` S3ObjectStore`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`objects `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` S3ObjectStore(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` bucket`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"evidence-claims\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` store_protection`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"refuse\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# default \"warn\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` create_bucket`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`True`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# default True`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` object_lock_mode`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"GOVERNANCE\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` object_lock_days`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`365`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`]})})})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`What it finds`}),_jsx(_components.th,{children:`What it does`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`No bucket`}),_jsx(_components.td,{children:`Creates it with Object Lock enabled, versioning on, and a default retention rule. Nothing is printed: the happy path is not an incident`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`A bucket with no Object Lock`}),_jsxs(_components.td,{children:[`Names the property in a warning, and under `,_jsx(_components.code,{children:`refuse`}),` stops the write. `,_jsx(_components.strong,{children:`It is not repaired`}),`, because S3 enables Object Lock only at bucket creation`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`A backend without Object Lock`}),_jsxs(_components.td,{children:[`Degrades with the reason named, never silently. Under `,_jsx(_components.code,{children:`refuse`}),` it creates nothing`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`It could not look`}),_jsxs(_components.td,{children:[`Reports `,_jsx(_components.code,{children:`unknown`}),`, and `,_jsx(_components.code,{children:`refuse`}),` treats that as a refusal`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[_jsx(_components.code,{children:`unknown`}),` is not `,_jsx(_components.code,{children:`off`}),`.`]}),` A credential missing `,_jsx(_components.code,{children:`s3:GetObjectLockConfiguration`}),`,\nor a 403 on `,_jsx(_components.code,{children:`HeadBucket`}),`, means the SDK cannot see the protection rather than\nthat there is none. A guard that stands down where it cannot look guards\nnothing.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Object Lock enabled is not the same as protected.`}),` With no default retention\nrule, objects in a lock-enabled bucket carry no retention and delete like any\nother, so that state is reported as unprotected, because it is. Setting\n`,_jsx(_components.code,{children:`days: 0`}),` is a legitimate choice for a customer applying per-object retention\nthemselves, and the readiness check says what it sees.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`warn`}),` is the default and it is not a silent third outcome: the write goes\nahead and is announced with the property named. `,_jsx(_components.code,{children:`refuse`}),` is the posture for a\ncustomer who would rather hold no evidence than hold evidence they cannot\ndefend.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`the-three-credentials`,children:`The three credentials`}),`\n`,_jsxs(_components.p,{children:[`Three roles, three policies. Replace `,_jsx(_components.code,{children:`BUCKET`}),` throughout.`]}),`\n`,_jsx(Heading,{level:`3`,id:`provisioner-one-time-not-the-agent`,children:`Provisioner, one time, not the agent`}),`\n`,_jsxs(_components.p,{children:[`Creates the bucket with its protection. A human or a CI job runs this once and\nthe agent never holds it. `,_jsx(_components.code,{children:`s3:CreateBucket`}),` is the permission that makes an\nunprotected-bucket mistake permanent, so it does not belong in a long-lived\nagent credential.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`15`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`15`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Version\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"2012-10-17\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Statement\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [{`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Effect\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Allow\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Action\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"s3:CreateBucket\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"s3:PutBucketVersioning\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"s3:PutObjectLockConfiguration\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"s3:GetBucketVersioning\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"s3:GetObjectLockConfiguration\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"s3:ListBucket\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ],`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Resource\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"arn:aws:s3:::BUCKET\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Set `,_jsx(_components.code,{children:`createBucket: false`}),` when a platform team or Terraform provisions the\nbucket instead. `,_jsx(_components.strong,{children:`The protection check still runs`}),`: turning off creation does\nnot turn off the reporting.`]}),`\n`,_jsx(Heading,{level:`3`,id:`writer-the-agent`,children:`Writer, the agent`}),`\n`,_jsx(_components.p,{children:`Adds objects. It cannot read them back, cannot list them, cannot delete\nanything, and cannot create or reconfigure a bucket.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`19`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`19`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Version\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"2012-10-17\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Statement\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Effect\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Allow\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Action\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"s3:PutObject\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Resource\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"arn:aws:s3:::BUCKET/*\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Effect\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Allow\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Action\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"s3:ListBucket\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"s3:GetBucketVersioning\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"s3:GetObjectLockConfiguration\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ],`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Resource\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"arn:aws:s3:::BUCKET\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(Warning,{children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`The second statement is wider than “adds objects and nothing else”, on\npurpose.`}),` A credential that literally adds objects and nothing else cannot\nrun the readiness check at all: `,_jsx(_components.code,{children:`HeadBucket`}),` needs `,_jsx(_components.code,{children:`s3:ListBucket`}),`, and the\ntwo protection reads need their own actions. Under it the SDK reports\n`,_jsx(_components.code,{children:`unknown`}),` on every run, which is honest and useless, and under `,_jsx(_components.code,{children:`refuse`}),` it\nwould never write.`]}),_jsxs(_components.p,{children:[`The three added actions are `,_jsx(_components.strong,{children:`bucket-configuration reads`}),`. They disclose no\nobject, no key and no byte; they answer only whether this bucket is versioned\nand locked. Granting them is what makes the guarantee checkable by the party\nwho depends on it.`]}),_jsxs(_components.p,{children:[`To hold the literal minimum instead, set `,_jsx(_components.code,{children:`createBucket: false`}),` and\n`,_jsx(_components.code,{children:`storeProtection: \"warn\"`}),`, verify the bucket once with the provisioner\ncredential, and accept that the SDK will say it cannot see the protection.\nThat is the true statement, and the reason `,_jsx(_components.code,{children:`unknown`}),` is a state at all.`]})]}),`\n`,_jsx(Heading,{level:`3`,id:`reader-the-pack-runner`,children:`Reader, the pack-runner`}),`\n`,_jsx(_components.p,{children:`Reads objects and nothing else. No write, no delete, no configuration. This is\nthe credential that syncs the bucket down before you build a pack.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`15`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`15`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Version\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"2012-10-17\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Statement\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Effect\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Allow\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Action\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"s3:GetObject\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Resource\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"arn:aws:s3:::BUCKET/*\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Effect\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Allow\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Action\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"s3:ListBucket\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Resource\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"arn:aws:s3:::BUCKET\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`Note what no credential has: `,_jsx(_components.code,{children:`s3:DeleteObject`}),`.`]}),` Nothing in this system\ndeletes evidence, so nothing that touches the bucket is granted the ability to.\nObject Lock is the backstop for a credential that gets one anyway.`]}),`\n`,_jsx(Heading,{level:`2`,id:`backends`,children:`Backends`}),`\n`,_jsxs(_components.p,{children:[`The store takes your own client, and an `,_jsx(_components.code,{children:`endpoint`}),` with path-style addressing\nmakes an S3-compatible backend behave like S3. Object Lock support differs\nbetween backends and changes between their releases, so this page names none of\nthem.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`The SDK detects and reports, which is the only claim that survives a backend\nchanging under you.`}),` Run the readiness check against a real bucket on the\nbackend you intend to use, and read what it says before you rely on it.`]}),`\n`,_jsx(Heading,{level:`2`,id:`check-without-gating`,children:`Check without gating`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`checkProtection()`}),` in TypeScript, `,_jsx(_components.code,{children:`check_protection()`}),` in Python, returns\nthe verdict and writes nothing. It names no bucket\nand no key, so it is safe to surface somewhere that must stay content-blind:\na health endpoint, a readiness probe, a dashboard tile.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"system","config":{},"pageMetadata":{"title":"Set up the bucket","description":"What the SDK creates by default, and the three credentials that touch it","href":"/guides/bucket"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"What the SDK does on first use","slug":"what-the-sdk-does-on-first-use","depth":2,"children":[]},{"title":"The three credentials","slug":"the-three-credentials","depth":2,"children":[{"title":"Provisioner, one time, not the agent","slug":"provisioner-one-time-not-the-agent","depth":3,"children":[]},{"title":"Writer, the agent","slug":"writer-the-agent","depth":3,"children":[]},{"title":"Reader, the pack-runner","slug":"reader-the-pack-runner","depth":3,"children":[]}]},{"title":"Backends","slug":"backends","depth":2,"children":[]},{"title":"Check without gating","slug":"check-without-gating","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"sanning","siteName":"Sanning","title":"Set up the bucket - Sanning","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-18T03:08:46.369Z","originalFileLocation":"guides/bucket.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"What the SDK creates by default, and the three credentials that touch it\">\u003cmeta data-mint-head name=\"application-name\" content=\"Sanning\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/sanning/pnqAxzOQf6cvFVD-/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/sanning/pnqAxzOQf6cvFVD-/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/sanning/pnqAxzOQf6cvFVD-/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/sanning/pnqAxzOQf6cvFVD-/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/sanning/pnqAxzOQf6cvFVD-/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/sanning/pnqAxzOQf6cvFVD-/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/sanning/pnqAxzOQf6cvFVD-/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/sanning/pnqAxzOQf6cvFVD-/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/sanning/pnqAxzOQf6cvFVD-/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Set up the bucket - Sanning\">\u003cmeta data-mint-head property=\"og:description\" content=\"What the SDK creates by default, and the three credentials that touch it\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Sanning\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.sanning.io/guides/bucket\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://sanning.mintlify.app/_mintlify/api/og/v2?division=Guides\u0026amp;title=Set+up+the+bucket\u0026amp;description=What+the+SDK+creates+by+default%2C+and+the+three+credentials+that+touch+it\u0026amp;theme=3f292c21f65cad333d695d2e\u0026amp;signature=736a1e5c3cfac32d20494645cc260f9a04f52b066fbc9d2dd37762b4ea6419d4\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Set up the bucket - Sanning\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"What the SDK creates by default, and the three credentials that touch it\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://sanning.mintlify.app/_mintlify/api/og/v2?division=Guides\u0026amp;title=Set+up+the+bucket\u0026amp;description=What+the+SDK+creates+by+default%2C+and+the+three+credentials+that+touch+it\u0026amp;theme=3f292c21f65cad333d695d2e\u0026amp;signature=736a1e5c3cfac32d20494645cc260f9a04f52b066fbc9d2dd37762b4ea6419d4\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/sanning/pnqAxzOQf6cvFVD-/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Sanning\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#3457D5\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.sanning.io/guides/bucket\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guides/bucket.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.sanning.io/#organization\",\"name\":\"Sanning\",\"url\":\"https://docs.sanning.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/sanning/gnQDixfAYN05cK1Z/logo/sanning-lowercase-ink.svg?fit=max\u0026auto=format\u0026n=gnQDixfAYN05cK1Z\u0026q=85\u0026s=5d9db4102bd87669e7393535cc6a2178\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.sanning.io#website\",\"name\":\"Sanning\",\"url\":\"https://docs.sanning.io\",\"publisher\":{\"@id\":\"https://docs.sanning.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.sanning.io/guides/bucket#webpage\",\"url\":\"https://docs.sanning.io/guides/bucket\",\"name\":\"Set up the bucket\",\"description\":\"What the SDK creates by default, and the three credentials that touch it\",\"dateModified\":\"2026-09-18T03:08:46.369Z\",\"isPartOf\":{\"@id\":\"https://docs.sanning.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.sanning.io/guides/bucket#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.sanning.io/guides/bucket#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Guides\",\"item\":\"https://docs.sanning.io/guides/anchor\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Set up the bucket\",\"item\":\"https://docs.sanning.io/guides/bucket\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.sanning.io/guides/bucket#article\",\"headline\":\"Set up the bucket\",\"name\":\"Set up the bucket\",\"description\":\"What the SDK creates by default, and the three credentials that touch it\",\"url\":\"https://docs.sanning.io/guides/bucket\",\"mainEntityOfPage\":{\"@id\":\"https://docs.sanning.io/guides/bucket#webpage\"},\"dateModified\":\"2026-09-18T03:08:46.369Z\",\"publisher\":{\"@id\":\"https://docs.sanning.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.sanning.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Sanning\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Sanning","nav":{"global":null,"groups":[{"group":"Getting started","pages":[{"title":"Introduction","href":"/index"},{"title":"Quickstart","href":"/quickstart"}]},{"group":"Concepts","pages":[{"title":"How Sanning works","href":"/concepts/how-it-works"},{"title":"The trust boundary","href":"/concepts/trust-boundary"},{"title":"The witness","href":"/concepts/witness"},{"title":"What a hand-off record does not prove","href":"/concepts/limits"}]},{"group":"Guides","pages":[{"title":"Anchor from your agent","href":"/guides/anchor"},{"title":"Trace a LangChain agent","href":"/guides/langchain"},{"title":"Trace a Vercel AI SDK call","href":"/guides/vercel"},{"title":"Record a file a tool produces","href":"/guides/file-records"},{"title":"Record a hand-off between two agents","href":"/guides/handoff"},{"title":"Hand over and verify a case","href":"/guides/handoff-case"},{"title":"Keep what you anchored","description":"The bytes a commitment is over, where they live, and why a pack needs them","href":"/guides/log-store"},{"title":"Set up the bucket","href":"/guides/bucket"},{"title":"API keys and scopes","description":"The two things a key can do, and why enrollment is not a step you write","href":"/guides/keys-and-scopes"},{"title":"How an agent enrolls","href":"/guides/enrollment"},{"title":"Dev and production","href":"/guides/environments"}]},{"group":"Verify","pages":[{"title":"Verify in a browser","href":"/verify/browser"},{"title":"Verify at the command line","href":"/verify/cli"},{"title":"What a verdict means","href":"/verify/what-a-verdict-means"}]},{"group":"Reference","pages":[{"title":"Command line","href":"/reference/cli"},{"title":"Scopes","href":"/reference/scopes"},{"title":"Errors","href":"/reference/errors"},{"title":"Wire formats","href":"/reference/wire-formats"},{"title":"A2A 1.0.0 mapping","href":"/reference/a2a-mapping"}]}]},"title":"Set up the bucket - Sanning","buildId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","deploymentId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","dynamics":[],"chunks":[]}