PurposeMesh 16 August 2026

PurposeMesh

Purpose-bound access, enforced everywhere. Public status: Technical Preview. The React, Fastify, policy-core, and SQLite path is implemented and locally verified; production identity, shared control-plane scale, and external enforcement are not. An external target becomes supported only after a conformant adapter completes apply, revoke, read-back, rollback, drift, and differential-policy tests.

Technical Preview Local demo verified Not production-ready External adapters fidelity-gated

1. Executive summary

The requirement fits PurposeMesh, but the secure answer is not “RBAC everywhere.” It is a small functional-role model combined with business DataScope, resource relationships, purpose, classification, time, and target-native enforcement.

Open-source release status · Technical Preview: use this build to evaluate the model, API, local enforcement behavior, lifecycle controls, and contributor contract. Do not use it as a production authorization control plane. The preview has no compatibility or support guarantee, enterprise identity path, multi-tenant control store, or externally verified target adapter. Every future production claim requires linked conformance evidence.

Target business outcome: SAP, BW, Elasticsearch, ADF, application, and BI pipelines can land in one governed store while each team receives a different server-enforced row and field view. Five capability personas stay stable: Viewer, Operator, Data Steward, Security Auditor, and Platform Admin. A Contract Capsule says exactly which resource, rows, fields, actions, purpose, conditions, and obligations are allowed. Removing a team revokes the implemented local desired-state relationship once; verified removal at external enforcement points requires conformant adapters with published evidence, successful revoke, and matching target read-back.

Target product outcome: PurposeMesh becomes an authorization delivery and assurance plane. It evaluates new applications through a PDP and compiles legacy/data-platform policy through conformant adapters. A fidelity firewall refuses any translation that would weaken row, field, masking, purpose, JIT, or audit semantics.

Truth as of this build: standing row and field policy works in the local core and SQLite warehouse. The console, API, minimal AuthZEN evaluation adapter, local persistence, policy explanation, lifecycle workflow, reusable content-addressed role objects, and staged workload contracts are real. Native-shaped compiler artifacts are previews; seeded fidelity gates block execution and keep apply/revoke/read-back arrays empty. External SAP, BW, Elasticsearch, ADF, warehouse-native, and BI changes are not. There is no enterprise OIDC/SCIM, catalog/lineage crawler, connector worker, target read-back, drift reconciliation, or multi-replica control store yet.

How PurposeMesh fits with established authorization systems

PurposeMesh does not claim to replace established policy engines, relationship systems, or native enforcement controls. Its intended layer is the delivery and assurance work around them: one reviewable DataScope contract, refusal of lossy target translations, governed lifecycle changes, and evidence that a target still matches policy. That differentiation remains a product hypothesis until external adapters and adopters validate it.

Established capabilityWhat it is designed to doPurposeMesh’s intended relationshipEvidence in this preview
OPA, Cedar, and CerbosExpress and evaluate authorization policy for an application or service.Complement the decision layer with shared data-scope obligations, target delivery, lifecycle, and enforcement evidence; future PDP integrations may reuse these tools rather than recreate them.The repository has its own local policy core and minimal application adapter. It does not yet provide interchangeable OPA, Cedar, or Cerbos backends.
OpenFGA and SpiceDBModel and answer relationship-based authorization questions at application scale.Use governed resource relationships as one decision input, then add purpose, classification, rows, fields, leases, and target-state assurance where a use case requires them.Local membership and capsule relationships are implemented; no OpenFGA or SpiceDB integration is shipped.
PostgreSQL RLS, Elasticsearch DLS/FLS, SAP authorization, and BI semantic securityEnforce access at the system that serves or operates on the resource.Keep those systems as the final PEPs. A PurposeMesh adapter must translate only supported semantics and prove apply, read-back, rollback, and drift behavior.SQLite row and field release is locally enforced. External native artifacts are blocked previews and prove no target enforcement.

Claim boundary: RBAC, ABAC, ReBAC, purpose constraints, policy decision points, row security, field controls, JIT access, and reconciliation are established patterns. PurposeMesh’s proposal is their contract-and-evidence composition across heterogeneous applications and data platforms—not a claim to have invented those primitives or to be the only product combining them.

Real product walkthrough

See the working reference flow establish identity, release a server-authorized data view, explain the active boundary, compare tenant-scoped results, author least-privilege access, and enter independent review.

Animated PurposeMesh walkthrough showing authorized data access, tenant isolation, role authoring, and governance
Short guided loop through the implemented local product surfaces.

Product surfaces

PurposeMesh architecture and enforcement boundary
Architecture control planeImplemented local path and fidelity-gated production boundary.
Complete synthetic-data scope released to the explicitly authorized Data Owner
Authorized Data Owner viewComplete tested scope through an explicit data-governance contract.
Tenant-scoped vendor data view proving role and row isolation
Scoped vendor isolationShared physical data, different server-enforced row and field release.
Role Studio composing a purpose-bound least-privilege policy
Least-privilege authoringBusiness intent becomes a reviewable Contract Capsule.
Lifecycle access review showing independent approval evidence
Governed lifecycleIndependent review, bounded elevation, recertification, and offboarding evidence.

What this demonstrates: these are real local application paths backed by the tested reference API and policy core. External platform adapters remain preview-only until apply, read-back, rollback, drift, and equivalence gates pass.

2. Problem statement

Enterprises move sensitive data through SAP S/4HANA, SAP BW, ADF, search, application APIs, warehouses, and BI tools. Several pipelines can feed one physical store, but every human and workload identity is entitled to a different combination of records, fields, actions, purpose, and duration.

Formal problem statement

Coarse application roles cannot safely express data-level boundaries, while encoding every vendor, team, region, dataset, field, and application into role names creates role explosion. The organization needs one reusable authorization model that keeps a small set of capability roles, binds access to governed data contracts and relationships, separates human and workload identities, supports immediate lifecycle change, and refuses enforcement when a target cannot preserve the required controls.

The authorization plane must also know what data exists, who owns it, how it is classified, where it flows, and which access paths can bypass policy. PurposeMesh can make decisions only from registered and trusted metadata; production discovery connectors and steward approval are therefore part of the control, not optional inventory work.

Consider one unified operational store fed through several independent paths:

Enterprise sources
S/4HANA, BW, CRM, WMS, ITSM, BOBJ
Independent pipelines
BW chains, Elasticsearch, ADF, and BOBJ connectors
Tested end to end
100,000 deterministic synthetic, lineage-tagged records
Role-filtered access
Data Owner baseline plus scoped consumer views
  • Vendor Operations sees assigned purchasing organizations and plants, with vendor identifiers masked.
  • L1 support sees health, counts, timestamps, and sanitized errors—not vendor PII or raw payload.
  • L2 BW can monitor or retry selected chains without receiving unrelated vendor rows.
  • Platform Operations sees cross-team technical telemetry but no business payload.
  • Finance Audit receives clear vendor identifiers only for an approved case and bounded time.
  • Unified Data Owner can inspect the complete synthetic source only through an explicit data-governance contract; this is the controlled baseline for comparison.
  • Platform Admin maintains connectors and policy but reads no business data by default.

Enforcement boundary: every data request is authorized server-side. Subject, purpose, action, resource, row predicates, and field projection are evaluated before the API releases a response.

The local seed demonstrates a smaller version: Emma and Finn share the Business consumer persona but different capsule attributes keep ACME and GLOBEX rows disjoint. Offboarding ACME removes Emma’s local desired-state path while Finn remains. That does not yet prove removal in an external BW role, Elasticsearch cluster, ADF factory, or BI workspace.

Business outcomeReuse one governed data platform across teams without duplicating pipelines, dashboards, or tenant-specific roles.
Security outcomeDeny by default; keep administration separate from data; prove row, field, purpose, action, time, and workload boundaries.
Delivery outcomeRecord one relationship change and revoke local desired state now; conformant adapters with published evidence must later apply, read back, and reconcile that removal at every external enforcement point.

3. Use cases and discovery questionnaires

Use the following scenarios to validate product fit and the questionnaires to turn an application, dataset, or pipeline into an evidence-backed authorization design. Answers should name authoritative systems and owners; “unknown” becomes a fail-closed gap, not an assumed permission.

Use-case framing

WhoHuman or workload identity, capability role, assurance, employment or service status.
WhatDataset, application, action, classification, row domain, and releasable fields.
Why and whenBusiness purpose, approval, ticket, time window, session, network, and risk context.
Where enforcedAPI, query, SAP/BW object, search role, warehouse RLS, BI model, export, or operation boundary.

Primary use case: one multi-pipeline store, many least-privilege views

S/4 vendor and purchasing data, BW process-chain events, Elasticsearch telemetry, ADF-loaded customer, transaction, and inventory data, ITSM tickets, and BOBJ operations land in one synthetic unified store containing 100,000 records by default. ACME, GLOBEX, support, application, data, and platform teams use the same physical target. The policy must isolate their rows and fields while preserving source, pipeline, and classification lineage.

ActorRequired accessMust remain prohibited
Unified Data OwnerThe full approved synthetic source through an explicit data-governance contract, including Restricted rows and the complete registered field allowlist.Policy administration by implication, production data outside the registered resource, or an unauthenticated “raw” bypass.
ACME consumerACME vendor rows for the approved analytics purpose; approved business fields only.GLOBEX rows, bank account, tax identifiers, pipeline administration, and unrelated exports.
GLOBEX consumerGLOBEX vendor rows under the same shared physical source.ACME rows and all protected fields not explicitly released by contract.
L1 SupportChain health, counts, timestamps, and sanitized status.Vendor master details, confidential dumps, raw payload, retry, or administrative actions.
L2 BW / BOBJApproved monitor, diagnose, retry, or report-repair actions for assigned products.Unrelated vendor data, unrestricted export, policy administration, and cross-team access.
Platform OperationsCross-team sanitized technical telemetry and connector health.Business payload and an implied right to query business datasets.
Platform AdminManage policy, connectors, releases, and evidence.Business-data read unless a separate, approved, time-bounded contract authorizes it.
Pipeline workloadsOne stage-specific read or write contract per S/4 extract, BW activation, and telemetry publication identity.One shared service account with end-to-end source, target, secret, and payload access.

Supporting use cases

UC-01 · Controlled baseline

Data Owner source view

Use an explicit high-clearance data contract—not Platform Admin or an unauthenticated fixture—to inspect the complete synthetic source and establish the comparison baseline.

UC-02 · Tenant isolation

Shared target, disjoint data

Keep ACME, GLOBEX, and future tenants on one governed target while proving that each receives only its contract-bound rows and fields.

UC-03 · Tiered operations

L1, L2 BW, and L2 BOBJ

Separate health visibility, technical diagnosis, retry, and report repair without turning support levels into broad business-data roles.

UC-04 · Workload isolation

One identity per pipeline stage

Bind BW extraction, activation, ADF, BOBJ, and sanitized Elasticsearch telemetry publication to different identities, resources, actions, secrets, and purposes.

UC-05 · Verified execution

Authorized data view

Open Access → Data and run a server-authorized view. Every account switch clears the prior result before another query can run.

UC-06 · Temporary elevation

JIT diagnostics

Freeze dataset, row, field, action, purpose, approval, assurance, and expiry into a revocable grant that never becomes standing access.

UC-07 · Lifecycle

One central lifecycle intent

Add or remove a capsule membership centrally and revoke local desired state. Conformant adapters with published evidence must apply the target changes, read them back, and retain completion evidence before external removal is considered verified.

UC-08 · Application portability

One decision contract

Integrate an API, dashboard, database, or enterprise platform through the same subject-action-resource-context request and typed obligations.

Stakeholder questionnaires

Run these as separate interviews. Record the respondent, source system, evidence link, owner, confidence, and follow-up date for every answer.

Executive and product sponsor

Outcome and risk questionnaire

  1. Which business risk, audit finding, or delivery delay must this program reduce?
  2. Which teams, vendors, regions, and legal entities must be isolated?
  3. Which applications and data products are in the first release, and which are explicitly out of scope?
  4. Is sharing one governed platform preferable to creating physical copies, and what exceptions are permitted?
  5. Who may accept residual authorization or connector-fidelity risk?
  6. How quickly must onboarding, emergency elevation, revocation, and offboarding take effect?
  7. Which regulations, contracts, or internal policies define the evidence and retention requirement?
  8. What measurable outcome defines success: fewer roles, faster fulfillment, fewer incidents, lower audit effort, or all four?
  9. Who is the accountable Data Owner for the unified store, and does “complete view” mean standing, time-bounded, or case-bound access?
Data owner, steward, privacy, and security

Data boundary questionnaire

  1. What datasets exist, where do they originate, and who is accountable for each one?
  2. Which attributes identify tenant, vendor, company code, purchasing organization, plant, region, or department?
  3. What is the approved classification and field-level sensitivity, and who attested it?
  4. Which rows and fields may each persona receive for each business purpose?
  5. Which actions are standing, approval-gated, export-restricted, or prohibited?
  6. Can data from different tenants or purposes ever be combined? If so, under whose approval?
  7. What authentication assurance, device, network, ticket, or session conditions are required?
  8. What is the maximum JIT duration, who independently approves it, and who may revoke it?
  9. What must happen when ownership, classification, lineage, or purpose is missing or disputed?
  10. How often are contracts, classifications, memberships, and exceptions reviewed?
  11. Which exact fields form the public allowlist, and which tenant, product, pipeline, source, and classification dimensions must constrain every role?
Application owner and developer

PEP integration questionnaire

  1. Where are authentication and authorization performed today, and which identity claims are authoritative?
  2. What subject, action, resource, and trusted context can the application send to the decision service?
  3. At which API, query, export, batch, dashboard, and operation boundaries must policy be enforced?
  4. Can the application enforce row filters, field projection, masking, purpose, action, and maximum-result obligations?
  5. How are background jobs, integrations, and service identities authenticated and authorized?
  6. What is the fail-closed behavior when the PDP is unavailable, an obligation is unknown, or policy is stale?
  7. Is decision caching allowed, for how long, and how are membership or policy changes invalidated?
  8. What latency, availability, concurrency, and regional requirements apply?
  9. How will negative authorization, bypass, export, and regression tests run in CI and release gates?
  10. Which endpoints can return records, aggregates, schema, or pipeline metadata, and which enforcement point constrains each response?
  11. When accounts switch or policy changes, how are in-flight requests aborted and prior rows, counts, fields, and caches cleared?
Platform, connector, SAP/BW, data engineering

Enforcement and pipeline questionnaire

  1. Which target systems and deployed editions must receive native policy?
  2. Can each target preserve row, field, purpose, action, time, and workload-identity semantics exactly?
  3. How are target policies planned, approved, installed, rolled back, and versioned?
  4. Can installed policy, assignments, and hashes be read back and compared with desired state?
  5. Which identity runs each source, staging, transformation, target, and telemetry stage?
  6. What may each workload read, write, operate, rotate, or log—and which secrets can it obtain?
  7. Can one account currently span several stages or bypass a governed path?
  8. Do logs contain payload, identifiers, secrets, or restricted error dumps, and how are they sanitized?
  9. Who owns connector outages, drift, failed revocation, and emergency rollback?
  10. Can the unified store retain authoritative source, pipeline, target, and classification lineage for at least 100,000 deterministic test records?
Operations, audit, compliance, and rollout owners

Lifecycle and assurance questionnaire

  1. What event starts onboarding, transfer, leave, suspension, service retirement, or team offboarding?
  2. Which system is authoritative for human status, workload status, ownership, and group membership?
  3. How quickly must sessions, JIT grants, memberships, target assignments, tokens, and secrets be revoked?
  4. What evidence must connect request, approval, decision, policy version, target receipt, read-back, and reconciliation?
  5. What drift threshold is tolerated, who is alerted, and when must the affected path fail closed?
  6. What audit-retention, privacy, immutability, search, and legal-hold requirements apply?
  7. What availability, recovery-time, recovery-point, backup, and regional-failover objectives apply?
  8. Which pilot proves the model end to end, and what explicit exit criteria authorize expansion?
  9. Who owns the operating model after launch: policy, identity, data, connectors, incidents, evidence, and periodic review?
  10. Which exact positive, negative, concurrency, performance, schema-drift, and account-switch tests must pass for every seeded identity?

Decision-ready exit criteria

  • Every data response is authorized server-side; row predicates and field projection are applied before results leave the API.
  • The default deterministic synthetic unified store contains at least 100,000 lineage-tagged records from multiple modeled source and pipeline families.
  • Only an explicitly contracted Unified Data Owner receives the complete approved source; Platform Admin remains a zero-business-data role.
  • Every protected operation requires an authenticated human or workload identity.
  • A missing identity, purpose, scope, contract, classification, or enforcement capability denies access.
  • Cross-tenant isolation is demonstrated with negative tests on the shared physical source.
  • Every seeded role is tested at the network boundary: unauthorized rows and fields are absent from the response, not merely hidden in the interface.
  • Account switching aborts in-flight work, clears previous rows and authorization metadata, establishes a new session, and requires a new explicit query.
  • Platform administration provides no implicit business-data read.
  • JIT access is independently approved, scope-frozen, time-bounded, auditable, and immediately revocable.
  • Offboarding closes the implemented local relationship and active elevation paths; target assignments, external sessions, and secrets close only through conformant lifecycle adapters with matching read-back evidence.
  • Every decision identifies the contributing contract, capsule, obligations, and policy version.
  • Every target adapter proves semantic fidelity before apply and supports read-back, rollback, and drift response.
  • Unknown datasets, owners, classifications, obligations, or bypass paths remain blocked until governed.
  • Pagination, filtering, sorting, aggregates, charts, search, and export use the same server-side row and field policy; no operation materializes the complete store in the browser.
  • The pilot passes functional, negative, failure, recovery, ≥100,000-row scale, concurrency, and independent security review.

4. Few-role RBAC + ABAC + ReBAC

Classic RBAC fails when a role name encodes job × tenant × vendor × company × region × application × fields. Five stable capability personas avoid that multiplication:

Viewer

Discover, read, and query. DataScope, purpose, classification, projection, and export policy still apply.

Operator

Monitor, run, retry, and cancel. Technical detail is separate from business payload.

Data Steward

Classifies, proposes, approves data policy, and attests. This is the governance function; no self-approval or implicit raw-data read.

Security Auditor

Reviews decisions, evidence, drift, and control operation. Read-only evidence access does not imply business-data access.

Platform Admin

Configures PurposeMesh and adapters. Receives no implicit business-data read.

ModelWhat it contributesExample
RBACStable functional permissionOperator may retry a chain
ABACSubject, resource, action, and environment valuesCompany 1000, purchasing org US01, purpose operations
ReBACBusiness relationship without a copied rolemember-of(user, vendor-ops-us); operates(team, pipeline)

Current implementation and remaining gap: the seeded personas illustrate scope separation. Role Studio now content-addresses and reuses an action/ceiling capability persona, purpose/scope capsule, and matching contract; the principal assignment lives on the membership relationship. Identical drafts no longer create per-person copies. The authoring vocabulary can still form more combinations than the intended five governed capability personas, so production policy must constrain it to approved Viewer, Operator, Data Steward, Security Auditor, and Platform Admin templates plus shared typed scopes.

5. Contract Capsule and DataScope

A Contract Capsule is one atomic authorization envelope. Its row predicate and field release remain coupled; combining several grants must never create a wider row/column cross-product.

ObjectMeaningStatus
Subject / persona Human or workload identity, live status, functional verbs, classification ceiling, and authoritative attributes. Local persona and principal; Target IdP/SCIM provenance and assurance.
Capsule Scoped membership, trusted purpose, attributes, optional hierarchy, and active lifecycle state. Local
Contract Dataset, purpose, personas, actions, classification maximum, row predicate, and field restriction. Local
DataScope Typed row domain: tenant, product, company code, purchasing organization, plant, region, department, source, and classification. Partial product/tenant/region/department/source locally; SAP dimensions are target.
Relationships Member-of, owns, operates, derives-from, and approves links. Partial membership and capsule hierarchy; general graph is target.
Obligations Allowlist, deny, mask, audit, no-export, maximum rows, justification, and expiry. Partial fields/audit/expiry; general masks and no-export are target.

Representative DataScope

{
  tenant: "enterprise-a",
  products: ["process_chains", "bw_vendor"],
  companyCodes: ["1000"],
  purchasingOrganizations: ["US01", "US02"],
  plants: ["TX01"],
  classificationMax: "confidential"
}

“All view” is Viewer with an enterprise DataScope and appropriate class clearance, not Platform Admin. Restricted fields or export should be separate, justified, time-bounded actions.

6. Architecture: runtime today and production target

PurposeMesh’s target canonical model is application-agnostic: identity facts, business scope, policy, enforcement, and evidence stay separate so one access intent can govern a warehouse, SAP, search, BI, or a future application without copying the human role model into every platform. The running build is a reference estate with local enforcement and one minimal application decision adapter—not universal target enforcement.

Executive view · working now

One decision model, enforced locally

  • The browser is untrusted; the API revalidates the live principal and calls the PDP.
  • Personas, capsules, contracts, bindings, JIT grants, and audit state are persisted in a single-node SQLite control snapshot.
  • The local warehouse path compiles authorized scope to parameterized SQL, filters rows, and projects fields before returning data.
  • A strict minimal POST /access/v1/evaluation adapter exposes the same PDP to a reference application and returns enforceable field/contract/capsule obligations.
  • Role Studio submits governed standing-access requests. A Data Owner and a Governance Admin must approve independently; the first approval is visible but does not grant access.
  • Three versioned warehouse SoD rules evaluate standing plus requested access, and manual human-membership recertification records exact assignment evidence.
  • Compiler output includes a policy hash/version, eligible assignments, local capability gates, and target-shaped previews. Missing purpose/row fidelity blocks seeded deployments, sets previewOnly, and leaves apply/revoke/read-back arrays empty.
  • The one-node control snapshot has verified online backup and transactional restore with integrity manifests and rollback bundles.

Developer view · production target

Closed-loop enforcement at every edge

  • Enterprise OIDC plus authoritative HR/SCIM and managed/SPIFFE workload identity establish identity and lifecycle state.
  • Catalog connectors supply governed schema, classification, owner, lineage, existing access, and target capability.
  • AuthZEN-compatible application PEPs ask a highly available PDP; legacy/data platforms receive adapter-verified native policy.
  • A transactional shared store, outbox workers, read-back, drift reconciliation, rollback, offsite disaster recovery, and externally anchored append-only audit close the loop.
  • Catalog-derived owners, configurable SoD policy, scheduled human and workload recertification, notifications, and explicit overdue consequences replace the seeded governance fixtures.

How PurposeMesh knows the data—and who may access it

1 · Known facts The current principal and persona; active capsule memberships; capsule scope attributes; registered dataset classification and allowed field paths; bound contracts; active JIT grants; and current time.
2 · Deterministic decision Match identity, action, dataset, trusted purpose, persona, live capsule, contract, classification ceiling, and row predicate. If any required fact is absent or contradictory, deny.
3 · Authorized release Filter rows at the enforcement path, project only allowlisted fields, remove denied fields conservatively, return reason and policy identifiers, and append an audit event.

Access → Data runtime path

1 · Authenticate
establish the verified human or workload identity
2 · Open Data
show signed-in identity, capsule, and permitted purpose controls
3 · Run view
principal comes from the verified token, never from a subject selector
4 · Enforce
parameterized row scope, class ceiling, allowlist, and deny obligations
5 · Release + prove
paged authorized rows, explanation, lineage, and receipt

Data Owner baseline

Complete view is a data permission

dana.owner reaches the complete approved synthetic dataset only because capsule data-governance-owner binds contract wh.data-owner for purpose data-governance, Restricted ceiling, every registered product/source, and the complete explicit field allowlist. That view uses the ordinary authenticated policy path; it is not a support shortcut or Platform Admin inheritance.

Every other identity

The browser receives only the authorized projection

GET /api/warehouse/records derives the subject from the token, requires a trusted purpose, intersects live membership and contract scope, compiles parameterized SQL, applies classification and field rules, and returns a cursor page of 50 records by default and at most 100. The response carries authorized facets, lineage, allowed/denied fields, contract and capsule identifiers, plus a hash-chained receipt. A user cannot broaden access by changing a filter, route, purpose, cursor, limit, or client state.

Capability boundary: the tool can decide access for data and identity metadata registered in PurposeMesh. The demo has one hard-coded data-owner reviewer in data-governance-owner and three fixed warehouse SoD rules; it does not crawl enterprise systems, discover schema or lineage, derive owners from a catalog, inspect target grants, infer entitlement from behavior, or synchronize HR/directory assignments. Production connectors may suggest classifications, but accountable owners approve them. Unknown or unclassified resources remain restricted; access is explicit policy, never an AI guess.

Governed standing-access path

1 · Draft
schema-bound intent and metadata-only impact preview
2 · Guard
validate target and evaluate standing + candidate SoD
3 · Request
freeze evidence; direct apply remains disabled
4 · Dual review
Data Owner + independent Governance Admin; partial means pending
5 · Apply + evidence
revalidate, reuse content-addressed policy objects, identify assignment, audit

The requester, target, and one person attempting both reviewer roles are rejected. The service proves that independent reviewers are available before accepting the request, rechecks reviewer authority and SoD before final application, and never treats the first approval or a UI-visible draft as access. Recertification later refers to the exact assignment id and captured membership fingerprint so review cannot drift onto a replacement membership.

Production target flow

Identity/PIP
HR, IdP, SCIM, team graph, workload identity
Resource knowledge
catalog, owner, schema, classification, lineage
PDP + compiler
subject, action, resource, context, DataScope
Fidelity firewall
native, gateway, isolated projection, or block
Evidence
read-back, drift, decision/use log, offboard proof

Fidelity firewall

Each adapter declares exactly what it can enforce. A policy is deployable only when every mandatory property has a safe implementation:

CapabilityNativeAlternativeUnsafe result
Row predicateTarget RLS, BW characteristic values, ES DLSTrusted query gateway or isolated projectionBlock
Field release / maskCLS/FLS/OLS/maskingGoverned view/indexBlock
Purpose / JITOnline PEP or expiring target grantGateway with current PDPBlock
Revocation proofApply + target read-backQuarantine target until verifiedDo not mark active/revoked

The current compiler records required, supported, and missing local capabilities. It may still show a native-shaped preview when a gate fails, but missing purpose/row or other required fidelity marks deployment blocked, sets previewOnly, and keeps all execution-plan arrays empty. Its model is hard-coded, not discovered from an installed platform version. Only a future connector-executed apply followed by matching target read-back is enforcement evidence.

Current trust path

PurposeMesh architecture path Untrusted console to control API to the PurposeMesh policy core and state store, with compiler JSON preview toward target PEPs that are not yet connected. Web console Untrusted client Control API AuthN + governance PurposeMesh core Model · PDP · compiler State SQLite snapshot Compiler JSON preview — no live push ES DLS BW auth BOBJ Warehouse Targets remain final PEPs. No external adapter is connected in this build.
Figure 1. Trust path. The console visualizes policy; the API authenticates and records; the PurposeMesh policy core decides and compiles; the state repository is a single-node SQLite snapshot. Connector workers described in architecture notes are not implemented.

One contract, many enforcement points

One contract, many PEPs A single vendor ACME contract compiled toward Elasticsearch, BW, warehouse SQL, and a planned Tableau live connection. Contract vendor.acme.slice purpose vendor-performance · vendor_id from capsule.vendor_set Elasticsearch DLS terms query SAP BW 0VENDOR values Warehouse Compiled SQL RLS Tableau / PBI Planned PEP Same predicate. Different native syntax. Tableau is guidance, not a shipped adapter.
Figure 2. One contract, many enforcement points. Warehouse SQL is enforced in the demo. ES/BW/BOBJ documents are generated. Tableau / Power BI / Looker adapters are target design, not shipped code.

Robustness: verified local recovery and production target

Current verified boundary: the single-node SQLite control snapshot can be copied with SQLite online-backup semantics, parsed through the production snapshot loader, and checked against a hash-and-count manifest. Restore revalidates the bundle, swaps it transactionally, and retains a rollback bundle; path-component checks reject symbolic links. This is local backup/restore, not offsite, encrypted, immutable, point-in-time, or regional disaster recovery.

Current evidence boundary: each audited mutation persists a complete JSON snapshot containing the growing audit array, so storage and write work grow with retained history (O(N) snapshot size). The local unkeyed hash chain can reveal inconsistent retained events, but a writer able to replace the complete mutable snapshot can truncate or recompute it. A colocated backup manifest proves bundle integrity, not external audit anchoring.

  • Stateless API/PDP replicas across failure domains backed by a transactional policy store.
  • Outbox-backed connector work so state change and delivery cannot diverge.
  • Signed policy versions, an explicitly bounded last-known-good cache, and authorization epochs in cache keys.
  • Fail closed for restricted reads, writes, export, JIT, and governance; no generic fail-open switch.
  • External append-only audit with an independent anchor, target evidence, offsite/encrypted backup, point-in-time restore, key rotation, chaos, and regional recovery tests.

No unmeasured promise: this repository has one SQLite writer. Availability, revocation, and recovery SLAs must be measured with the real identity provider, data volume, network, and target platforms before they are claimed.

7. Current seeded personas and capsules

These identities make the local scenario demonstrable; they are not the recommended production role taxonomy. Production should map them to the five reusable Viewer / Operator / Data Steward / Security Auditor / Platform Admin capability personas plus shared scopes. Shared demo password: cca-demo.

UserPersonaVerbs / ceilingCapsulePurposeTypical products
dana.owner
Dana Morgan
Data Owner view, audit / restricted Unified data governance data-governance Every registered warehouse product and all four pipeline families; complete explicit field allowlist through wh.data-owner
ana.l1
Ana Cole
L1 Support view / internal Support L1 incident-triage events, tickets, process_chains; SLA and PC status (vendor_id masked)
ben.l2bw
Ben Walsh
L2 BW view, operate / confidential Support L2 BW replication-repair events, transactions, telemetry, process_chains, bw_vendor; PC detail without payload
cara.l2bobj
Cara Nguyen
L2 BOBJ view, operate / confidential Support L2 BOBJ report-repair tickets, bobj; BOBJ universe/report ops
dev.obs
Dev Okonkwo
Pipeline / ES Ops view, operate, rotate / internal Platform observability pipeline-reliability events, telemetry, es_logs; PC detail masked (no vendor_id, payload, error_dump)
emma.acme
Emma Patel
Business consumer view / confidential Vendor ACME vendor-performance customers, transactions, inventory, bw_vendor for V1001/V1002/ACME
finn.globex
Finn Okafor
Business consumer view / confidential Vendor Globex vendor-performance Same products, vendor set V2001/V2002/GLOBEX
gita.steward
Gita Shah
Data steward view, administer / confidential Vendor ACME vendor-performance Same ACME slice as Emma; steward verbs on the persona
hugo.admin
Hugo Meyer
Platform admin administer, audit, rotate / none Control plane governance Audit and lifecycle only. Ceiling none does not pass the data-path ceiling check.
iris.admin
Iris Chen
Platform admin administer, audit, rotate / none Control plane governance Independent governance review and control-plane operations only. Ceiling none does not pass the data path.

Least-privilege pipeline stages

pc.vendor.replicate
read restricted S/4 → write restricted BW stage
pc.vendor.activate
read BW stage → write governed BW provider
pc.vendor.telemetry
read sanitized chain status → write ES technical logs

Each stage has a separate workload principal, capsule, contract set, and compiled SPIFFE-shaped desired identity. The replicator is explicitly denied provider write, so compromise of the first stage does not inherit the activation stage. These identities still use the shared password only as local fixtures; no SPIFFE credential is issued and no SAP, BW, ADF, or Elasticsearch target is changed. Parent capsule Vendor domain exists so local offboard can cascade ACME and Globex together.

8. Decision equation (deny by default)

Missing context is a denial. Clients cannot omit purpose, scope, or the record to widen a decision. The implemented check is:

Allow iff principal is live and persona has the verb and purpose is present and a live capsule exists and (control-plane rule or a matching standing contract or an approved JIT snapshot that still passes the same row and classification checks). Otherwise deny.

Contract allow (data path)

  1. Unknown, disabled, or time-invalid subject → deny.
  2. Persona lacks the requested action → persona_lacks_verb.
  3. Purpose missing or blank → purpose_required.
  4. No active capsule membership → no_capsule_membership.
  5. Binding must join a live capsule to a contract on that dataset; persona id (or inherits) must be allowed; contract must include the action.
  6. Purpose must equal the contract purpose.
  7. Record or dataset classification must be at or under the contract maximum and the persona ceiling. Ceiling none fails the data path.
  8. If the predicate is not true, a record is required; the predicate is evaluated against record attributes and capsule attributes (eq, in, fromCapsuleAttr, and, or).
  9. Every matching candidate is kept. Deny-fields are the union (conservative). A later valid contract cannot be hidden by an earlier miss.

Control-plane path

Datasets marked controlPlane (the audit log) require purpose governance, an action of audit, administer, or rotate, and membership in the control-plane capsule.

JIT fallback

JIT is evaluated only when no standing contract allows the request. It is not a dataset-wide bypass. A request must resolve a predeclared approvalRequired contract bound to the live capsule and allowed persona. The grant snapshots contract id, frozen predicate and capsule attributes, classification maximum, field allow/deny lists, actions, purpose, policy version, assurance context, and expiry. At use time the PDP rechecks live principal/capsule state, persona verb, exact resource/purpose/action, not-before/expiry, the frozen row predicate, and both persona and contract classification ceilings. Released fields are the dataset allowlist intersected with the JIT allowlist, minus JIT denies.

Approval is by a different control-plane Platform Admin and may not widen the requested envelope. The requester or a Platform Admin can revoke an approved grant with a reason; membership removal, capsule offboard, principal disablement, or expiry also closes it. Regression tests prove the frozen ACME vendor set never returns GLOBEX after live scope changes. There is no seeded restricted S/4 JIT template: an unconfigured request fails early, and even a test-injected restricted template fails because its dataset is above the L2 confidential ceiling.

9. Role Studio: rules, not an LLM

Role Studio turns a business need into a reviewable draft and then submits a governed standing-access request. Editing or previewing the draft never assigns access.

  • Ask-to-role is a parser. parseNeedToRole matches phrases (process chain, BW vendor, BOBJ, ES logs, tenants, regions, “not vendor PII”, and so on). It is deterministic. There is no model call.
  • Canvas is tokens. Verbs, purpose, ceiling, SAP and generic products, sources, tenants, regions, departments, and field masks. Click or drag onto wells. Validation is schema-bound to approved enumerations.
  • Preview is metadata only. Impact totals run against the warehouse filter. Record samples are stripped from authoring preview so a draft cannot leak rows.
  • Request-only apply path. POST /api/role-requests freezes the draft and review evidence. The legacy-looking POST /api/roles/apply route always returns approval_workflow_required; there is no direct assignment route.
  • No membership back door. POST /api/capsules/:capsuleId/members and the core lifecycle reject every business/data capsule add with approval_workflow_required. Only explicit control-plane administrator recovery retains a direct add.
  • Two independent approval roles. Every request requires one eligible data-owner approval and one eligible governance-admin approval from two different people. The requester and target cannot review the request, the same reviewer cannot satisfy both roles, and the request is rejected up front if an independent pair is unavailable.
  • Partial approval grants nothing. The first decision is stored and shown as progress while the request remains unapplied. Before the second approval, the service revalidates reviewer authority, target state, frozen evidence, and separation-of-duty results; only then does internal applyRoleDraft content-address and reuse a capability persona, scoped capsule, and matching contract, store the assigned persona on a uniquely identified membership, and retire superseded Role Studio memberships.
  • Separation of duty is executable. Versioned local rules evaluate standing plus candidate warehouse access and reject: operating both s4_master and transactions; combining purpose audit with operate; or combining purpose data-governance with operate.

Configuration boundary: the seeded Data Owner and those three SoD rules are intentionally hard-coded reference fixtures, not a generic ownership registry or policy administration engine. Production must constrain roles to approved capability templates, derive accountable owners from governed resource relationships, and manage organization-specific, versioned conflict rules.

Both authorship paths work in the demo: a non-reviewer self-request is approved by dana.owner plus either independent admin. If hugo.admin authors a cross-target request, Dana plus iris.admin must approve it because Hugo is ineligible to review his own request; the reverse applies when Iris authors. Both admins have control-plane membership and no business-data ceiling.

Example asks the parser is tested against:

  • L1 support should see process chain health but not vendor PII
  • ACME finance team only NA transactions
  • observability can see ES/pipeline logs with payload stripped
  • GLOBEX EU team needs BW vendor analytics and customer tickets, no bank accounts

Manual access recertification

A Governance Admin can start or renew a recertification campaign. The seeded Data Owner and Governance Admin can list evidence and decide only items for which their reviewer role is eligible: administrator access requires Data Owner review, Data Owner access requires Governance Admin review, and ordinary human access permits either. Each item captures the exact human membership assignment id plus principal, capsule, persona, and a fingerprint. Attest keeps that assignment; revoke removes that exact assignment and retains the last-admin safeguard. A reviewer cannot certify their own membership.

Current limitation: campaigns include active human memberships only. There is no scheduler, notification service, workload-membership review, or automatic overdue enforcement. Status is refreshed when a recertification endpoint is used; passing the due time marks a campaign expired but does not revoke its pending memberships.

10. Dataset, classification, catalog, and lineage

Reference data product: vendor process-chain runs

The safest monitoring product is curated separately from raw replication payload. Scope dimensions travel with every row; prohibited secrets are rejected before ingest.

FieldClassificationSecurity use
tenant_idSecurityMandatory isolation guard from trusted resource context
company_code, purchasing_org, plantInternalBusiness row-scope dimensions
chain_id, run_id, source, targetInternalProcess identity and lineage
Status, timestamps, extracted/loaded countsInternalTeam dashboards and reconciliation
vendor_id, vendor_nameConfidentialMask or release by approved purpose
error_message_sanitizedInternalOperator diagnosis
raw_error_payloadRestrictedSeparate break-glass resource; never an ordinary log field
Credential, token, private key, secretProhibitedReject/quarantine and alert before indexing

Access matrix over the same source

SubjectRowsFieldsActions / conditions
Vendor Ops UStenant=A AND purchasing_org IN (US01, US02)Operational fields; vendor id last-fourView for operations; no export
L2 BWAssigned chains and company codesTechnical detail; raw payload deniedView, run, retry
Platform OpsAll chain-health rowsNo vendor identity or business payloadMonitor/operate
Finance AuditApproved company codesClear vendor id only during case-bound JITView; export separately approved
Platform AdminNo business rows by defaultPolicy and connector metadataAdminister

How PurposeMesh learns what data exists

  1. Connectors inventory systems, schemas, fields, BW objects, indexes, semantic models, dashboards, existing access, and direct-query paths.
  2. Lineage links S/4 source → BW object/process chain → Elasticsearch, warehouse, or ADF destination → BI semantic model.
  3. Rules and scanners propose classifications. Inferred labels remain candidates; automation never auto-grants.
  4. The accountable owner confirms classification, permitted purposes, and scope dimensions.
  5. The resource publishes only when required enforcement capabilities pass the fidelity firewall.
  6. Schema, labels, lineage, ownership, and actual target grants are rescanned and reconciled.

Current answer: PurposeMesh only knows seeded/manually registered resources, fields, classifications, capsule attributes, and the demo’s hard-coded Data Owner relationship. It has a local two-role approval workflow, but no crawler, production catalog, classification scanner, lineage collector, generic resource-owner registry, or entitlement-discovery connector. Unknown/unclassified data must remain restricted until those governed inputs exist.

Local dataset used by the demo

The first API start builds one deterministic 100,000-row synthetic unified store at data/cca.sqlite. It is one physical fact store, not one copy per role. Each fact carries business-scope, source-pipeline, and classification dimensions. Queries compile product plus optional tenant, region, department, source/pipeline, and classification ceiling into parameterized SQL, then apply an explicit field allowlist and deny obligations before returning a bounded page.

Modeled ingestion familyRepresentative sourceUnified productsRequired control
sap-s4-bw-vendorSAP S/4HANA → SAP BW → PurposeMesh Unified Data Stores4_master, bw_vendor, process_chainsRestricted source fields do not become support data.
sap-bw-elastic-opsSAP BW → Elasticsearch → PurposeMesh Unified Data Storees_logs, events, telemetryTechnical messages are separated from raw payload and vendor identifiers.
azure-adf-business-loadAzure Data Factory → PurposeMesh Unified Data Storecustomers, transactions, inventoryTenant and field tags survive landing and transformation.
sap-bobj-report-refreshSAP BusinessObjects → PurposeMesh Unified Data Storebobj, ticketsOperational metadata does not imply access to business payload.

Separate hand-authored core records cover SLA, process-chain status/detail, BW vendor, S/4 vendor master, BOBJ, and Elasticsearch examples. Those small records test individual PDP decisions; the unified store tests large row scopes, field projection, pagination, and role-to-role isolation.

Desired state lives in data/cca-control.sqlite as a single snapshot. Demo/test startup may migrate v2→v3 only when legacy JIT is empty and every membership persona resolves from validated principal data; the migration is audited. Production refuses automatic v2 migration and requires a reviewed offline procedure. This remains a one-node demonstration persistence boundary, not an enterprise catalog or multi-replica policy database.

11. Authentication, JIT, onboarding, and offboarding

Authentication is not authorization

Current local authentication: demo mode exposes a seeded directory and scrypt password login. The demo JWT is short lived. Production mode disables those routes and validates a strict HS256 token contract intended for an upstream broker, with issuer, audience, subject, expiry, issued-at, token id, purpose, bounded lifetime, authentication assurance (password, mfa, or phishing-resistant), a required 64-hex authorization fingerprint, and current persona/kind checks. The fingerprint covers exact live membership assignment ids, personas, and capsules and is recomputed on every protected request; removal invalidates the token, and same-capsule re-grant cannot revive it. JIT assurance is copied from that verified token, never trusted from the request body; the upstream issuer remains responsible for actually establishing MFA. The web app stores its bearer token in tab-scoped sessionStorage, removes legacy localStorage, warns shortly before expiry, and clears protected state on expiry, 401, or account switch.

Not implemented: enterprise OIDC authorization flow, SCIM/HR sync, WebAuthn/conditional access, DPoP or mTLS token binding, cloud managed identity, SPIFFE issuance, certificate rotation, or lifecycle connectors. The API sets cache, MIME, and referrer hardening headers and the local HTML installs a baseline document-level CSP, but JavaScript can still read the current bearer token and production still needs a tested response-header CSP. The compiler’s SPIFFE string is desired state, not workload authentication.

Production target: OIDC/BFF with Authorization Code + PKCE, exact redirects, phishing-resistant MFA and step-up for privileged actions, and an HttpOnly, Secure, appropriately SameSite session cookie with CSRF protection and a restrictive tested CSP; unique short-lived managed/SPIFFE identities for pipelines; narrow vaulted SAP communication identities only where legacy integration requires them.

JIT is a bounded policy snapshot—not a bypass

  • The request resolves exactly one predeclared approvalRequired contract bound to the active capsule and permitted persona.
  • The grant snapshots contract id, frozen predicate and capsule attributes, classification maximum, allow/deny fields, actions, purpose, policy version, server-derived token assurance, and expiry.
  • A different active control-plane Platform Admin approves; approval cannot widen rows, class, fields, actions, purpose, assurance, or duration.
  • Each use re-evaluates live identity/membership, persona action, resource/purpose, time, frozen row predicate, persona ceiling, contract ceiling, and field intersection.
  • Requester or Platform Admin can revoke with reason; disablement, membership removal, capsule offboard, or expiry also closes the online grant.

Required regression: an ACME-scoped L2 JIT grant returns only the frozen ACME vendor set, never GLOBEX, even if live capsule attributes later change. Restricted S/4 JIT is rejected before approval when no eligible template exists or the requester ceiling is too low. The same invariant must hold in the PDP, API, SQL path, and each target adapter.

Smooth onboarding

Authoritative identity
active worker/workload and fresh attributes
Relationship
team and data-owner assignment
Policy proof
simulate positive/negative cases and SoD
Delivery
compile, apply, read back, activate

Current periodic review boundary

Manual recertification snapshots active human assignments by assignment id and membership fingerprint, accepts attest or exact-assignment revoke decisions from an eligible non-self reviewer, and preserves the last control-plane admin. It does not schedule campaigns, notify reviewers, include workload memberships, or revoke access merely because an undecided item is overdue.

One offboard intent; external proof required

PurposeMesh records one central lifecycle intent. The current build revokes locally governed access; enterprise completion requires conformant adapters with published evidence to execute and verify the target-specific steps below.

  1. Mark team/capsule inactive so online decisions deny.
  2. Revoke sessions/refresh and update the authorization epoch.
  3. Remove memberships, bindings, JIT, and expiring access leases.
  4. Disable or transfer team-owned workload identities and secrets.
  5. Apply removal to every target, read it back, and prove zero residual grants.
  6. Retain correlated, immutable completion evidence.

Current local behavior: a control-plane admin can deactivate one capsule or descendants, remove local memberships/bindings, expire local JIT, and receive pre-removal compiler previews. The control-plane capsule and last-admin safeguards remain. Because fidelity is blocked, the execution/revoke plan is empty; nothing is sent to SAP or Elasticsearch, and the repository cannot yet prove external removal.

12. Threat model and platform enforcement points

Priority threats

ThreatFailureControl
Dashboard-only filterDirect query exposes another teamServer/store/semantic-model PEP on every path
Shared pipeline accountOne secret exposes every source and targetUnique managed/SPIFFE identity per pipeline/data product
Stale team membershipLeaver retains accessSCIM event, online inactive guard, short session, lease, target reconcile
Multiple-role unionRows from one grant combine with fields from anotherAtomic capsules; conservative composition; isolated projection
JIT without row/class boundTemporary access becomes dataset-wideFrozen predicate and ceilings rechecked per record
Admin implies data accessControl-plane compromise becomes data compromiseManagement/data split; independently approved temporary data capsule
Classification lost in copyTarget releases restricted fieldLineage label propagation and destination capability gate
Target manual grant/driftNative state exceeds approved policyRead-back, reconciliation, alert/quarantine, signed evidence
PDP outageFail-open or broad stale decisionHA PDP, bounded versioned cache, fail closed on high risk
Aggregate/search inferenceRestricted cohort can be inferredCohort limits, pre-aggregation, query controls, or physical isolation

Native enforcement map

PlatformCorrect PEPCaveatRepository status
S/4HANAPFCG/authorization objects for functions; CDS DCL for instance data; narrow extraction identityHuman access must not reuse a broad extraction accountTarget
BW/4HANAStandard auth for model/load; analysis auth for authorization-relevant characteristics; S_RS_PC/S_RS_ADMWB for chain actionsField-isolated monitoring may require a governed query/data productJSON preview
ElasticsearchRead-only index privilege + DLS + FLSMultiple roles widen access; aggregates may infer; sensitive cohorts may need separate indexesJSON preview
ADFAzure management RBAC + unique managed identity; source/target data PEPADF orchestrates; it is not interactive row-level securityIdentity shape only
WarehouseNative RLS/CLS/masking or governed viewTest owner/superuser, export, clone, time-travel, and service pathsLocal SQL only
Power BISemantic-model RLS/OLS; consumers Read/Viewer onlyWrite/Contributor/Member/Admin can bypass RLS; segregate creatorsTarget
Tableau / LookerStore RLS plus compiled identity/group policy; secured extract as new datasetWorkbook filters, hidden sheets, and unfiltered extracts are not securityTarget
API/basic appMinimal POST /access/v1/evaluation adapter asks the canonical PDP; application PEP applies returned obligationsCurrent adapter is dataset/purpose/optional-record scoped; broader SDK and conformance work remainsLocal adapter

BI rule: prefer live connection plus store/semantic-model security. Any extract or import is data movement and becomes a new governed resource. No BI adapter exists in this repository.

13. AuthZEN, compiler outputs, and fidelity

Application interoperability: minimal adapter now, broader target next

The current API exposes POST /access/v1/evaluation using the OpenID Authorization API shape: subject, action, resource, and context. It accepts a user/workload subject, a canonical action, a dataset, trusted purpose, and optional recordId. A normal caller can evaluate only the authenticated subject and its purpose must exactly match a scoped token. Cross-subject checks require a Platform Admin; a scoped admin token must be governance-scoped. Records are resolved server side, unknown or mismatched resources deny, and every evaluation is audited.

{
  subject: { type: "user", id: "emma.acme" },
  action: { name: "view" },
  resource: { type: "dataset", id: "bw_vendor" },
  context: { purpose: "vendor-performance", recordId: "bw-1" }
}

The response returns decision plus reason and obligations: allowed/denied fields, matching contract ids, capsule ids, and JIT policy version when applicable. The application PEP must apply every obligation before data release.

Boundary: this is a strict minimal reference adapter, not a claim of ecosystem-wide conformance. General resource types, richer DataScope and mask/no-export/maximum-row obligations, batch/search evaluation, PEP SDKs, conformance suites, and enterprise identity remain target work.

Desired-state compiler now

Admin routes GET /api/compiler and GET /api/compiler/:capsuleId return local JSON. Every capsule result has a deterministic policyHash and policyVersion, only active persona-compatible assignments, a deploymentStatus, previewOnly, target capability gates, and target-shaped artifacts. Required purpose/row fidelity is not available in current target compilers, so seeded target-bearing policies are blocked and their apply/revoke/read-back arrays are empty. No external target adapter or connector is present.

Compiler envelopeMeaning nowWhat it does not prove
Hash + versionContent-address the capsule, bindings, contracts, datasets, and current assignments.No signature, release approval, or target deployment.
AssignmentsInclude only active members whose relationship persona, action set, and class ceiling satisfy the contract.No external group or native-role membership exists.
Capability gatesCompare required versus locally modeled support for classification, rows, allow/deny fields, purpose, and workload identity; missing requirements block the artifact.No discovery of the installed target version, edition, license, configuration, or bypass paths.
PlanSchema for future apply, delete, and policy_hash_and_assignments read-back operations.Blocked policies keep all arrays empty; no worker executes operations or records target evidence.
TargetWhat is emitted todayWhen
Elasticsearch Role name, index pattern <normalized-dataset>-<12-hex-SHA256-prefix>-*, read privilege, DLS query compiled from the predicate (unsafe input becomes match_none), dataset field allowlist, and contract denies. Normalization uses NFKC, replaces unsafe characters, bounds length, and appends the hash prefix to prevent sanitized-name collisions. Any bound contract that includes view.
SAP BW Analysis-authorization shaped object: name ZCCA_…, InfoProvider ZVNDR_ANL or ZPC_MON, characteristic 0VENDOR with compiled values (including * or capsule vendor_set). Contracts on bw_vendor or pc_detail.
BOBJ Group names and folder paths under /ops/…. Contracts on dataset bobj.
Dashboards / spaces Space id = capsule id. Contracts on bw_vendor or contract ids starting with health.
ADF / workload SPIFFE id spiffe://cca/capsule/… and vault path. Empty unless the capsule has an active workload member and a bound contract includes operate or rotate. Pipeline capsule in the seed.

Current compilation fails closed on unsafe predicate material and on locally known missing capabilities. It does not yet publish a discovered, version-scoped capability manifest with passing conformance evidence for every target or implement native masking, general SAP dimensions, purpose/JIT delivery, connector apply, rollback, executed read-back, drift, or target audit.

Adapter definition of done

  1. Declare exact platform version/edition and capability manifest.
  2. Produce deterministic plan and diff from one signed policy version.
  3. Apply and revoke idempotently with bounded retry and rollback.
  4. Read target state back; do not mark active/revoked until it matches.
  5. Continuously detect drift and quarantine unsafe targets.
  6. Run differential tests proving the target returns exactly what the canonical PDP returns for the same subjects and data.

14. Run the demo and interpret verification

Requires Node.js 24+ and npm 11+.

  1. From the repository root: npm install
  2. Run npm run preflight for repository typechecks, core/API/web tests, and production builds.
  3. Run npm audit --omit=dev --audit-level=high for the dependency gate.
  4. npm run dev builds @cca/core and starts API + Vite console. API dev sets CCA_MODE=demo.
SurfaceURL / value
APIhttp://127.0.0.1:8787 — health /api/health, ready /api/ready
Consolehttp://127.0.0.1:5173 — authenticated data access is under Access → Data (#/data)
Passwordcca-demo for every seeded principal
Unified storedata/cca.sqlite (100,000 synthetic facts by default)
Control snapshotdata/cca-control.sqlite

Suggested walkthrough

  1. If this checkout preserved a v2 demo snapshot, sign in as hugo.admin, open Lifecycle, choose Reset demo, and confirm RESET once to load the expanded v3 S/4→BW→ES fixtures. This replaces local demo policy and audit state and is unavailable in production.
  2. Sign in as dana.owner (Data Owner, capsule data-governance-owner). Open Access → Data and select Run authorized view.
  3. Run the view. Confirm the title changes to …’s authorized records, the default store reports 100,000 synthetic facts, the complete explicit warehouse field allowlist is returned through wh.data-owner, the ceiling is Restricted, and Why this view is allowed identifies purpose data-governance. This is the controlled source baseline.
  4. Select Switch account. Verify the old token, rows, counts, fields, receipt, and in-flight requests are cleared. Sign in as emma.acme, return to #/data, and run again. Confirm only ACME rows and her approved fields arrive over the network.
  5. Repeat with finn.globex; confirm every returned row is GLOBEX and no ACME value is present. Repeat with gita.steward; confirm steward capabilities do not broaden the assigned tenant.
  6. Repeat with ana.l1, ben.l2bw, cara.l2bobj, and dev.obs. For each identity, compare Protected fields, row scope, products, classification ceiling, source/pipeline lineage, and the Authorization receipt against the matrix below.
  7. Finally use both hugo.admin and iris.admin. Confirm each Platform Admin can operate governance views but receives zero business rows and cannot obtain the Data Owner baseline by changing purpose, filters, route parameters, or client state.
  8. Sign in as a non-reviewer test identity such as ana.l1, open Request a role, and ask: L1 support should see process chain health but not vendor PII. Generate, tweak, preview, and submit the frozen self-request. Confirm no access changes on submission.
  9. Sign in as dana.owner, open Access Reviews, and approve as Data Owner. Confirm the request shows one of two approvals and remains unapplied. Then sign in as hugo.admin and approve as Governance Admin. Only now confirm that the reusable persona, capsule, warehouse contract, and uniquely identified membership appear.
  10. Test the cross-target path separately: sign in as hugo.admin, open Role Studio, author and submit a request for a non-admin target, and confirm no access changes. Approve it first as dana.owner, then as iris.admin. Confirm Hugo cannot approve the request he authored and final application occurs only after Iris supplies the independent Governance Admin approval.
  11. Open Policy compiler. Inspect JSON for Vendor ACME (ES terms on vendor_id, BW 0VENDOR, no live deploy banner).
  12. Capsule lifecycle: offboard Vendor ACME. Emma loses the slice; Finn does not.
  13. JIT: request from a non-admin against a predeclared bound contract. Approve only as Hugo, verify the row scope is unchanged, then revoke as requester or admin with a reason.

Role-by-role acceptance matrix

IdentityPositive assertionMandatory negative assertion
dana.ownerAll registered products, tenants, four source/pipeline families, classifications through Restricted, and the complete explicit field allowlist through wh.data-owner.Access comes from the data-governance-owner capsule, never Platform Admin inheritance or client impersonation.
ana.l1Internal process-chain/ticket health and sanitized operational fields.No Confidential/Restricted rows; email, account_number, payload, vendor_id, bank_account, and legal_name are absent.
ben.l2bwAssigned BW, process-chain, transaction/telemetry operations through Confidential.No Restricted rows; account_number is absent.
cara.l2bobjAssigned ticket and BOBJ operational metadata through Confidential.No unrelated products; account_number and payload are absent.
dev.obsInternal Elasticsearch/pipeline telemetry within the assigned product scope.No rows above Internal; email, account_number, and payload are absent.
emma.acmeOnly ACME rows for approved analytics products through Confidential.Zero GLOBEX/NOVA/HELIOS/ATLAS rows; account_number is absent.
finn.globexOnly GLOBEX rows under the same physical store through Confidential.Zero ACME/NOVA/HELIOS/ATLAS rows; account_number is absent.
gita.stewardThe same ACME row boundary as Emma with her steward capability profile.administer never expands tenant, product, purpose, or classification; account_number remains absent.
hugo.adminPolicy, connector, lifecycle, role-review, and audit metadata.Zero business records and zero implicit raw-data projection.
iris.adminPolicy, connector, lifecycle, role-review, and audit metadata; independent review for requests authored by Hugo.Zero business records and zero implicit raw-data projection.

Field-policy caution: the matrix above states the seeded contracts exactly. It is not a declaration that every other synthetic field is safe in production. Before using real data, accountable owners must classify fields such as email, vendor identity, legal name, bank data, tax identifiers, and payload, then tighten each contract allowlist accordingly.

Network-level proof: inspect API responses, not only rendered columns. A test fails if an unauthorized value reaches browser memory and is then hidden by React or CSS. Each role test must also cover direct record lookup, crafted tenant/product/pipeline filters, purpose mismatch, sort/search/aggregate/export paths, rapid account switching, offboarding, JIT expiry, and a newly added database column.

Security, failure, and scale gates

GateEvidence requiredRelease-blocking result
Authentication boundaryNo warehouse call before explicit run; missing/invalid/stale token is rejected; account switch aborts and clears.Any previous-user row, count, field, lineage, or receipt remains visible or cached.
Row and field isolationPositive and negative assertions for every identity at API-response level, including crafted record ids, tenants, products, purposes, and pipelines.An unauthorized value reaches the browser, even if the UI hides it.
Schema and query safetyExplicit field allowlist, deny precedence, parameterized predicates, unknown sort/filter rejection, new-column test, bounded response.SELECT *, client-only filtering, SQL injection, or schema growth widens a view.
Large-store behavior100,000 deterministic rows, cursor ordering by id, 50-row default, 100-row maximum, first/middle/last page, cancellation, and concurrent-account tests.Unbounded fetch, duplicate/skipped page behavior under the defined consistency model, or cross-principal cache reuse.
Measured performanceFixed-hardware p50/p95/p99 query and count latency, response bytes, memory, concurrency, timeout, database-unavailable, and recovery results.An unmeasured “enterprise scale” claim or a budget breach in the agreed benchmark environment.
Evidence integrityActor, purpose, effect, visible/returned count, contract, capsule, allowed/denied fields, audit sequence, and hash—without credentials or record values.Missing decision linkage, sensitive audit content, or a receipt that cannot be tied to the chained event.

What the automated evidence means

The local suites cover policy, API, web, login-to-policy, JIT lifecycle, persistence, and build behavior. They can prove only the code paths and fixtures they execute. They do not exercise a real SAP authorization object, BW analysis authorization, Elasticsearch role, ADF identity, warehouse-native RLS, or BI semantic model. Those claims require target-specific conformance environments and differential tests.

Latest full gate · 16 August 2026: repository typechecks and production builds passed; 57 core + 84 API + 55 web tests passed (196 total). There were no known vulnerabilities reported by npm audit on 16 August 2026 in the complete and production-only dependency scans. This is point-in-time dependency evidence, not proof that the application or future integrations are vulnerability-free.

15. Current implementation versus production target

Current and locally verifiable

  • Deny-by-default PDP with live principal, purpose, action, capsule, contract, predicate, classification, and fields.
  • Parameterized local warehouse row scope and field projection over generated data.
  • Authenticated Access → Data workflow with an explicit run action, a 100,000-row four-pipeline unified store, Data Owner baseline, role-filtered pages, policy explanation, lineage summary, protected fields, and authorization receipt.
  • JIT contract snapshot, independent approval, row/class recheck, bounded expiry, and explicit revoke workflow.
  • Local membership removal and capsule cascade offboard with pre-removal compiler previews; no executable external revoke plan.
  • Deterministic compiler hash/version, eligible assignments, local capability gates, target-shaped previews, blocked deployment status, and empty apply/revoke/read-back arrays.
  • Role Studio deterministic parser, metadata preview, and request-only queue with required Data Owner + Governance Admin approvals; partial approval grants nothing and direct /api/roles/apply is disabled.
  • Three versioned warehouse SoD rules over standing plus candidate access, and manual exact-assignment recertification for active human memberships.
  • Separate S/4 extraction, BW activation, and sanitized ES telemetry workload principals with stage-specific least-privilege contracts.
  • Single-writer SQLite desired state, rollback on failed persistence, readiness probe, in-process chained audit, and verified one-node online backup/transactional restore.
  • Demo scrypt login; production mode rejects demo login and validates the HS256 broker contract. The browser uses tab-scoped sessionStorage and clears on expiry/401/account switch; the local HTML entry point installs a baseline document-level CSP.

Required before production

  • Enterprise OIDC/BFF with protected cookies, CSRF controls, a tested response-header CSP, SCIM/HR, MFA/step-up, managed/SPIFFE workload identity, rotation, and session revocation.
  • Catalog, schema, classification, owner, lineage, existing-entitlement, and access-path discovery.
  • Governed five-persona templates and typed shared scopes; catalog-derived owners; configurable, organization-specific SoD policy; and scheduled human/workload recertification with notifications and explicit overdue consequences.
  • Broader AuthZEN resources/context, richer obligation schema, PEP SDKs and conformance; signed policy releases and discovered, version-scoped adapter capability manifests.
  • Live target plan/apply/revoke, read-back, rollback, drift, audit, and cross-target equivalence.
  • Transactional shared state, multi-replica PDP, outbox workers, externally anchored append-only audit, offsite/encrypted backup, point-in-time recovery, and regional recovery.
  • Real SAP/BW/ES/ADF/warehouse/BI conformance and bypass testing on the deployed versions and editions.

Robustness claim: local tests demonstrate the local implementation. The current full-snapshot persistence path grows with retained audit history, and its mutable local hash chain is not an external anchor. Production robustness begins only when every real access path and target has a documented passing conformance result, is continuously reconciled and failure-tested, and has undergone independent security review.

16. Now / Next / Later delivery roadmap

Roadmap state changes only when linked tests and public evidence satisfy the exit gate. Dates are planning windows, not production commitments; stars and page views measure awareness, not authorization correctness or adoption.

WindowBuild objectiveExit evidenceCommunity and adopter target
Now · 0–30 days
First tagged v0.1 release
Publish the v0.1 Technical Preview and build the PostgreSQL first adapter. Define the adapter SDK and versioned capability manifest; map eligible contracts to PostgreSQL row security and least-privilege field release; implement plan, apply, revoke, read-back, rollback, drift, and PDP-versus-target differential tests. Complete security policy, threat model, reproducible quickstart, signed release inputs, and contributor entry points. A real ephemeral PostgreSQL target runs in CI. No target is labeled verified until positive, negative, bypass, partial-failure, stale-policy, rollback, and read-back tests pass. Publish the exact supported PostgreSQL version and semantic gaps. 5 successful external evaluations, 8 structured user interviews, 5 substantive feedback threads, at least 1 external contribution, zero open critical findings, and median first maintainer response under 48 hours.
Next · 31–60 days
v0.2 Interoperability Preview
Full Authorization API 1.0 surface. Add single and multiple access evaluations, subject/resource/action search with pagination, PDP metadata and advertised capabilities, normative HTTPS/JSON behavior, request identifiers, and error handling. Publish a TypeScript PEP reference and conformance matrix. Run one non-demo PostgreSQL design-partner pilot. Every implemented endpoint maps to the final OpenID Authorization API 1.0 section and automated test. The PostgreSQL pilot produces target receipts, drift detection, revoke proof, and documented limitations; “AuthZEN 1.0 conformant” is not used until the full matrix passes. 15 cumulative successful evaluations, 3 active design partners, 2 external contributors, 1 non-demo PostgreSQL pilot, and at least 30% of new issues grounded in installation or real integration work.
Later · 61–90 days
v0.3 Adoption Preview
Elasticsearch second target. Discover deployed version, edition, and DLS/FLS capability; implement the same apply/revoke/read-back/rollback/drift and differential-test contract used for PostgreSQL. Begin enterprise OIDC, catalog/owner/classification ingestion, durable worker state, and externally anchored audit design. Elasticsearch passes the same adapter gate without weakening purpose, row, field, masking, or audit requirements. Publish one adopter architecture, failure report, and remediation history. If the target changes because adopter evidence points elsewhere, document the decision publicly instead of silently changing the milestone. 30 cumulative successful evaluations, 2 non-demo pilots, 1 public adopter story or attributable reference, 5 external contributors, 2 verified target environments, and 1 externally reported security or correctness issue fixed transparently.

Metric definitions: a successful external evaluation means a non-maintainer starts the project, compares at least two personas against the same synthetic store, confirms row/field isolation, and records the outcome. A pilot means a named owner evaluates a non-demo target with an agreed access boundary and success criterion. A target is “verified” only for the documented version, edition, configuration, and access paths that passed the conformance gate; this is project test evidence, not independent certification.

After the first 90 days

  1. Identity and catalog. Complete enterprise OIDC/SCIM, workload identity, governed inventory, owner, classification, schema, lineage, and existing-access ingestion.
  2. One complete enterprise path. Prove S/4 → BW process-chain/vendor monitoring → governed target store → one BI model, with Vendor Ops, L2, Platform Ops, and JIT Audit.
  3. Expand one target at a time. Add SAP/BW, ADF, and BI only after the adapter SDK and fidelity gate work on PostgreSQL and Elasticsearch. Do not count a generated policy document as an integration.
  4. Enterprise hardening. Add multi-replica state, outbox workers, immutable audit, performance budgets, recovery, chaos, independent threat review, and red-team testing.

Differentiation, stated honestly: the individual controls are established patterns. The product thesis is that a portable atomic access capsule, lineage-aware policy delivery, a fidelity firewall that refuses unsafe translations, access leases, and continuous target-state proof can reduce authorization drift across mixed estates. External adapters, independent contributors, and adopters—not a novelty claim—must validate that thesis.

Primary standards and platform documentation