API: Observability, tenant, commits, M7, refusals
Capability state: mixed. See per-operation labels in reference/capability-state.md.
This page covers the foundational and inspection-only endpoints: observability probes, tenant context (including tenant onboarding and company bootstrap), recent commits, M7 durable state inspection, and refusal-code introspection.
Observability probes
Section titled “Observability probes”These are unauthenticated and exist for ops and CI.
runtime.health
Section titled “runtime.health”GET /healthstate: staging-durableReturns 200 if the runtime is healthy.
runtime.ready
Section titled “runtime.ready”GET /readystate: staging-durableReturns 200 if the runtime is ready to accept work.
runtime.version
Section titled “runtime.version”GET /versionstate: staging-durableReturns the runtime version and the membrane contract version.
runtime.metrics
Section titled “runtime.metrics”GET /metricsstate: staging-durableReturns runtime metrics in a fixture-shaped surface today; production metrics surface format will be documented when the runtime metrics contract stabilizes.
Example
Section titled “Example”curl -s http://127.0.0.1:3011/healthcurl -s http://127.0.0.1:3011/readycurl -s http://127.0.0.1:3011/versioncurl -s http://127.0.0.1:3011/metricstenant.self
Section titled “tenant.self”Inspect own tenant / session boundary.
GET /v1/tenant/selfstate: shape-onlysdk_role: inspect own tenant/session boundaryrequest_record: CloudTenantSelfRequestresponses: tenant_context | receiptResponse
Section titled “Response”{ "operation": "tenant.self", "outcome": "verified", "body": { "tenant": "tenant_node:rheinwerk_calibration", "productionAdmission": false }, "receipt": {...}}Today, the only tenant is tenant_node:rheinwerk_calibration.
Tenant onboarding has no membrane endpoint yet (see
022 gap report
item 7).
SDK example
Section titled “SDK example”const tenant = await client.tenantSelf();tenant.create
Section titled “tenant.create”Record minimized tenant onboarding candidate with optional key custody reference and no raw customer payload storage.
POST /v1/tenants/createstate: staging-durablesdk_role: record minimized tenant onboarding candidate with optional key custody reference and no raw customer payload storagerequest_record: CloudTenantCreateRequestresponses: tenant_onboarding | refusal | receiptRequest
Section titled “Request”interface TenantCreateRequest { tenant?: GestaltRef; requested_tenant?: GestaltRef; // must start with "tenant_node:" host?: string; // unique per tenant company?: GestaltRef; parent?: GestaltRef; authority_epoch?: GestaltRef; home_reality?: GestaltRef; signing_key?: GestaltRef; encryption_key?: GestaltRef; auth_policy?: string; // e.g. "fixture_session_only" key_custody_attestation?: GestaltRef; fixture?: boolean; // must be true contains_customer_data?: boolean; // refused if true raw_customer_payload?: unknown; // refused if present}Response
Section titled “Response”{ "operation": "tenant.create", "outcome": "admitted", "body": { "tenant": "tenant_node:...", "host": "...", "company": "company_geist:...", "status": "candidate", "tenant_key_custody": "referenced_not_provisioned", "tenant_key_custody_bound": true, "durable_state": {...}, "raw_customer_data_stored": false, "production_admission": false }, "receipt": {...}}tenant_key_custody is one of:
referenced_not_provisioned— akey_custody_attestationref was supplied (the tenant points at a key custody record but the membrane does not provision keys here).not_provisioned— no attestation ref supplied.
Refusal codes:
tenant_onboarding_raw_payload_refused,
tenant_onboarding_invalid_tenant_ref,
tenant_onboarding_existing_tenant_refused,
tenant_onboarding_host_conflict.
SDK example
Section titled “SDK example”const created = await client.tenantCreate({ tenant: "tenant_node:rheinwerk_calibration", requested_tenant: "tenant_node:m21_koerper_fixture", host: "m21-koerper.fixture.local", company: "company_geist:m21_koerper_fixture", parent: "tenant_node:rheinwerk_calibration", authority_epoch: "authority_epoch:fixture", home_reality: "reality:fixture", auth_policy: "fixture_session_only", fixture: true,});company.bootstrap
Section titled “company.bootstrap”Record minimized company bootstrap hashes and verification evidence without raw register payload storage.
POST /v1/companies/bootstrapstate: staging-durablesdk_role: record minimized company bootstrap hashes and verification evidence without raw register payload storagerequest_record: CloudCompanyBootstrapRequestresponses: company_bootstrap | refusal | receiptRequest
Section titled “Request”interface CompanyBootstrapRequest { tenant?: GestaltRef; tenant_onboarding?: GestaltRef; company?: GestaltRef; legal_name?: string; legal_name_hash?: string; // computed from legal_name if absent legal_form?: string; // e.g. "DE_GmbH" jurisdiction?: string; // e.g. "DE" register_number_hash?: string; verification_evidence?: GestaltRef[]; fixture?: boolean; // must be true contains_customer_data?: boolean; // refused if true raw_register_payload?: unknown; // refused if present}Response
Section titled “Response”{ "operation": "company.bootstrap", "outcome": "admitted", "body": { "company": "company_geist:...", "jurisdiction": "DE", "status": "bootstrapped_fixture", "durable_state": {...}, "raw_customer_data_stored": false, "raw_register_payload_stored": false, "raw_legal_name_stored": false, "production_admission": false }, "receipt": {...}}The membrane stores only the legal name hash, the register
number hash, and the citation list. Raw register payloads and
the original legal_name are not persisted.
Refusal codes:
company_bootstrap_raw_register_payload_refused.
SDK example
Section titled “SDK example”const bootstrapped = await client.companyBootstrap({ tenant: "tenant_node:rheinwerk_calibration", tenant_onboarding: "tenant_node:m21_koerper_fixture", company: "company_geist:m21_koerper_fixture", legal_name: "M21 Koerper Fixture GmbH", legal_form: "DE_GmbH", jurisdiction: "DE", register_number_hash: "sha256:m21_fixture_register_hash", verification_evidence: ["evidence_bundle:fixture_advisor"], fixture: true,});commit.recent
Section titled “commit.recent”Inspect recent durable signed atom commits through the authorized tenant membrane.
GET /v1/commits/recentstate: staging-durablesdk_role: inspect recent durable signed atom commits through authorized tenant membranerequest_record: CloudRecentCommitsRequestresponses: commits | receiptResponse
Section titled “Response”{ "operation": "commit.recent", "outcome": "verified", "body": { "commits": [...], "durable": true }, "receipt": {...}}durable: true indicates the commit journal is operating against a
durable store (recent commit 9d3570e). In purely in-memory fixture
mode, durable: false.
SDK example
Section titled “SDK example”const recent = await client.recentCommits();m7.state
Section titled “m7.state”Inspect tenant-scoped durable M7 object counts without raw database access.
GET /v1/m7/statestate: staging-durablesdk_role: inspect tenant-scoped durable M7 object counts without raw database accessrequest_record: CloudM7StateRequestresponses: durable_counts | receiptResponse
Section titled “Response”{ "operation": "m7.state", "outcome": "verified", "body": { "remoteDurable": true, "rawDbExposed": false, "productionAdmission": false, "counts": { "atoms": 0, "evidenceBundles": 0, "passkeyBindings": 0, "sessionLifecycles": 0, "...": 0 } }, "receipt": {...}}rawDbExposed: false is asserted: the membrane never exposes raw
database access, even for inspection.
SDK example
Section titled “SDK example”const state = await client.m7State();refusal.codes
Section titled “refusal.codes”Inspect stable machine-readable refusal taxonomy.
GET /v1/refusals/codesstate: shape-onlysdk_role: inspect stable machine-readable refusal taxonomyrequest_record: CloudRefusalCodesRequestresponses: codes | receiptResponse
Section titled “Response”{ "operation": "refusal.codes", "outcome": "verified", "body": { "codes": [ "required_evidence_missing", "authority_package_stale", "...": "..." ] }, "receipt": {...}}The taxonomy is currently shape-only; codes are scattered as string literals across cloud handler code. A durable taxonomy is a roadmap item.
See reference/refusal-codes.md for the documented set.
refusal.registry
Section titled “refusal.registry”Inspect the developer refusal registry. Each entry carries category metadata, the guard rule that emits the code, the privacy posture, and the live runtime taxonomy attached to it.
GET /v1/refusals/registrystate: shape-onlysdk_role: inspect the developer refusal registryrequest_record: (empty body)responses: registry | receiptResponse
Section titled “Response”{ "operation": "refusal.registry", "outcome": "verified", "body": { "entries": [ { "code": "required_evidence_missing", "category": "evidence", "guard_rule": "...", "privacy_posture": "...", "runtime_taxonomy": ["..."] } ] }, "receipt": {...}}SDK example
Section titled “SDK example”const registry = await client.refusalRegistry();membrane.contract
Section titled “membrane.contract”Return the embedded gestalt-cloud-membrane.v0 contract document.
Useful for client-side introspection (matching SDK request shapes
against the live contract version, generating documentation, or
validating that a runtime is the expected version).
GET /v1/membrane/contractstate: shape-onlysdk_role: not yet wrapped — call directly when introspecting the contractrequest_record: (empty body)responses: contract_document | receiptRequest
Section titled “Request”The endpoint takes no body. No bearer token is required.
Response
Section titled “Response”The full membrane contract JSON document is returned as the response
body. See contracts/gestalt-cloud-membrane.v0.json
for the canonical shape.
curl -s http://127.0.0.1:3011/v1/membrane/contract | jq '.version'# "0.0.1-fixture"