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.
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.
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.
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 capability | What it is designed to do | PurposeMesh’s intended relationship | Evidence in this preview |
|---|---|---|---|
| OPA, Cedar, and Cerbos | Express 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 SpiceDB | Model 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 security | Enforce 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.
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.
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.
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.
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:
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.
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.
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.
| Actor | Required access | Must remain prohibited |
|---|---|---|
| Unified Data Owner | The 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 consumer | ACME vendor rows for the approved analytics purpose; approved business fields only. | GLOBEX rows, bank account, tax identifiers, pipeline administration, and unrelated exports. |
| GLOBEX consumer | GLOBEX vendor rows under the same shared physical source. | ACME rows and all protected fields not explicitly released by contract. |
| L1 Support | Chain health, counts, timestamps, and sanitized status. | Vendor master details, confidential dumps, raw payload, retry, or administrative actions. |
| L2 BW / BOBJ | Approved monitor, diagnose, retry, or report-repair actions for assigned products. | Unrelated vendor data, unrestricted export, policy administration, and cross-team access. |
| Platform Operations | Cross-team sanitized technical telemetry and connector health. | Business payload and an implied right to query business datasets. |
| Platform Admin | Manage policy, connectors, releases, and evidence. | Business-data read unless a separate, approved, time-bounded contract authorizes it. |
| Pipeline workloads | One 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. |
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.
Keep ACME, GLOBEX, and future tenants on one governed target while proving that each receives only its contract-bound rows and fields.
Separate health visibility, technical diagnosis, retry, and report repair without turning support levels into broad business-data roles.
Bind BW extraction, activation, ADF, BOBJ, and sanitized Elasticsearch telemetry publication to different identities, resources, actions, secrets, and purposes.
Open Access → Data and run a server-authorized view. Every account switch clears the prior result before another query can run.
Freeze dataset, row, field, action, purpose, approval, assurance, and expiry into a revocable grant that never becomes standing access.
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.
Integrate an API, dashboard, database, or enterprise platform through the same subject-action-resource-context request and typed obligations.
Run these as separate interviews. Record the respondent, source system, evidence link, owner, confidence, and follow-up date for every answer.
Classic RBAC fails when a role name encodes job × tenant × vendor × company × region × application × fields. Five stable capability personas avoid that multiplication:
Discover, read, and query. DataScope, purpose, classification, projection, and export policy still apply.
Monitor, run, retry, and cancel. Technical detail is separate from business payload.
Classifies, proposes, approves data policy, and attests. This is the governance function; no self-approval or implicit raw-data read.
Reviews decisions, evidence, drift, and control operation. Read-only evidence access does not imply business-data access.
Configures PurposeMesh and adapters. Receives no implicit business-data read.
| Model | What it contributes | Example |
|---|---|---|
| RBAC | Stable functional permission | Operator may retry a chain |
| ABAC | Subject, resource, action, and environment values | Company 1000, purchasing org US01, purpose operations |
| ReBAC | Business relationship without a copied role | member-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.
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.
| Object | Meaning | Status |
|---|---|---|
| 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. |
{
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.
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
POST /access/v1/evaluation adapter exposes the same PDP to a reference application and returns enforceable field/contract/capsule obligations.previewOnly, and leaves apply/revoke/read-back arrays empty.Developer view · production target
Data Owner baseline
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
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.
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.
Each adapter declares exactly what it can enforce. A policy is deployable only when every mandatory property has a safe implementation:
| Capability | Native | Alternative | Unsafe result |
|---|---|---|---|
| Row predicate | Target RLS, BW characteristic values, ES DLS | Trusted query gateway or isolated projection | Block |
| Field release / mask | CLS/FLS/OLS/masking | Governed view/index | Block |
| Purpose / JIT | Online PEP or expiring target grant | Gateway with current PDP | Block |
| Revocation proof | Apply + target read-back | Quarantine target until verified | Do 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 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.
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.
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.
| User | Persona | Verbs / ceiling | Capsule | Purpose | Typical products |
|---|---|---|---|---|---|
dana.ownerDana 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.l1Ana Cole |
L1 Support | view / internal | Support L1 | incident-triage | events, tickets, process_chains; SLA and PC status (vendor_id masked) |
ben.l2bwBen Walsh |
L2 BW | view, operate / confidential | Support L2 BW | replication-repair | events, transactions, telemetry, process_chains, bw_vendor; PC detail without payload |
cara.l2bobjCara Nguyen |
L2 BOBJ | view, operate / confidential | Support L2 BOBJ | report-repair | tickets, bobj; BOBJ universe/report ops |
dev.obsDev 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.acmeEmma Patel |
Business consumer | view / confidential | Vendor ACME | vendor-performance | customers, transactions, inventory, bw_vendor for V1001/V1002/ACME |
finn.globexFinn Okafor |
Business consumer | view / confidential | Vendor Globex | vendor-performance | Same products, vendor set V2001/V2002/GLOBEX |
gita.stewardGita Shah |
Data steward | view, administer / confidential | Vendor ACME | vendor-performance | Same ACME slice as Emma; steward verbs on the persona |
hugo.adminHugo 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.adminIris 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. |
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.
Missing context is a denial. Clients cannot omit purpose, scope, or the record to widen a decision. The implemented check is:
persona_lacks_verb.purpose_required.no_capsule_membership.inherits) must be allowed; contract must include the action.none fails the data path.true, a record is required; the predicate is evaluated against record attributes and capsule attributes (eq, in, fromCapsuleAttr, and, or).Datasets marked controlPlane (the audit log) require purpose governance, an action of audit, administer, or rotate, and membership in the control-plane capsule.
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.
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.
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.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.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.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.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.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 PIIACME finance team only NA transactionsobservability can see ES/pipeline logs with payload strippedGLOBEX EU team needs BW vendor analytics and customer tickets, no bank accountsA 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.
The safest monitoring product is curated separately from raw replication payload. Scope dimensions travel with every row; prohibited secrets are rejected before ingest.
| Field | Classification | Security use |
|---|---|---|
tenant_id | Security | Mandatory isolation guard from trusted resource context |
company_code, purchasing_org, plant | Internal | Business row-scope dimensions |
chain_id, run_id, source, target | Internal | Process identity and lineage |
| Status, timestamps, extracted/loaded counts | Internal | Team dashboards and reconciliation |
vendor_id, vendor_name | Confidential | Mask or release by approved purpose |
error_message_sanitized | Internal | Operator diagnosis |
raw_error_payload | Restricted | Separate break-glass resource; never an ordinary log field |
| Credential, token, private key, secret | Prohibited | Reject/quarantine and alert before indexing |
| Subject | Rows | Fields | Actions / conditions |
|---|---|---|---|
| Vendor Ops US | tenant=A AND purchasing_org IN (US01, US02) | Operational fields; vendor id last-four | View for operations; no export |
| L2 BW | Assigned chains and company codes | Technical detail; raw payload denied | View, run, retry |
| Platform Ops | All chain-health rows | No vendor identity or business payload | Monitor/operate |
| Finance Audit | Approved company codes | Clear vendor id only during case-bound JIT | View; export separately approved |
| Platform Admin | No business rows by default | Policy and connector metadata | Administer |
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.
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 family | Representative source | Unified products | Required control |
|---|---|---|---|
sap-s4-bw-vendor | SAP S/4HANA → SAP BW → PurposeMesh Unified Data Store | s4_master, bw_vendor, process_chains | Restricted source fields do not become support data. |
sap-bw-elastic-ops | SAP BW → Elasticsearch → PurposeMesh Unified Data Store | es_logs, events, telemetry | Technical messages are separated from raw payload and vendor identifiers. |
azure-adf-business-load | Azure Data Factory → PurposeMesh Unified Data Store | customers, transactions, inventory | Tenant and field tags survive landing and transformation. |
sap-bobj-report-refresh | SAP BusinessObjects → PurposeMesh Unified Data Store | bobj, tickets | Operational 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.
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.
approvalRequired contract bound to the active capsule and permitted persona.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.
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.
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.
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.
| Threat | Failure | Control |
|---|---|---|
| Dashboard-only filter | Direct query exposes another team | Server/store/semantic-model PEP on every path |
| Shared pipeline account | One secret exposes every source and target | Unique managed/SPIFFE identity per pipeline/data product |
| Stale team membership | Leaver retains access | SCIM event, online inactive guard, short session, lease, target reconcile |
| Multiple-role union | Rows from one grant combine with fields from another | Atomic capsules; conservative composition; isolated projection |
| JIT without row/class bound | Temporary access becomes dataset-wide | Frozen predicate and ceilings rechecked per record |
| Admin implies data access | Control-plane compromise becomes data compromise | Management/data split; independently approved temporary data capsule |
| Classification lost in copy | Target releases restricted field | Lineage label propagation and destination capability gate |
| Target manual grant/drift | Native state exceeds approved policy | Read-back, reconciliation, alert/quarantine, signed evidence |
| PDP outage | Fail-open or broad stale decision | HA PDP, bounded versioned cache, fail closed on high risk |
| Aggregate/search inference | Restricted cohort can be inferred | Cohort limits, pre-aggregation, query controls, or physical isolation |
| Platform | Correct PEP | Caveat | Repository status |
|---|---|---|---|
| S/4HANA | PFCG/authorization objects for functions; CDS DCL for instance data; narrow extraction identity | Human access must not reuse a broad extraction account | Target |
| BW/4HANA | Standard auth for model/load; analysis auth for authorization-relevant characteristics; S_RS_PC/S_RS_ADMWB for chain actions | Field-isolated monitoring may require a governed query/data product | JSON preview |
| Elasticsearch | Read-only index privilege + DLS + FLS | Multiple roles widen access; aggregates may infer; sensitive cohorts may need separate indexes | JSON preview |
| ADF | Azure management RBAC + unique managed identity; source/target data PEP | ADF orchestrates; it is not interactive row-level security | Identity shape only |
| Warehouse | Native RLS/CLS/masking or governed view | Test owner/superuser, export, clone, time-travel, and service paths | Local SQL only |
| Power BI | Semantic-model RLS/OLS; consumers Read/Viewer only | Write/Contributor/Member/Admin can bypass RLS; segregate creators | Target |
| Tableau / Looker | Store RLS plus compiled identity/group policy; secured extract as new dataset | Workbook filters, hidden sheets, and unfiltered extracts are not security | Target |
| API/basic app | Minimal POST /access/v1/evaluation adapter asks the canonical PDP; application PEP applies returned obligations | Current adapter is dataset/purpose/optional-record scoped; broader SDK and conformance work remains | Local 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.
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.
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 envelope | Meaning now | What it does not prove |
|---|---|---|
| Hash + version | Content-address the capsule, bindings, contracts, datasets, and current assignments. | No signature, release approval, or target deployment. |
| Assignments | Include only active members whose relationship persona, action set, and class ceiling satisfy the contract. | No external group or native-role membership exists. |
| Capability gates | Compare 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. |
| Plan | Schema 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. |
| Target | What is emitted today | When |
|---|---|---|
| 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.
Requires Node.js 24+ and npm 11+.
npm installnpm run preflight for repository typechecks, core/API/web tests, and production builds.npm audit --omit=dev --audit-level=high for the dependency gate.npm run dev builds @cca/core and starts API + Vite console. API dev sets CCA_MODE=demo.| Surface | URL / value |
|---|---|
| API | http://127.0.0.1:8787 — health /api/health, ready /api/ready |
| Console | http://127.0.0.1:5173 — authenticated data access is under Access → Data (#/data) |
| Password | cca-demo for every seeded principal |
| Unified store | data/cca.sqlite (100,000 synthetic facts by default) |
| Control snapshot | data/cca-control.sqlite |
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.dana.owner (Data Owner, capsule data-governance-owner). Open Access → Data and select Run authorized view.wh.data-owner, the ceiling is Restricted, and Why this view is allowed identifies purpose data-governance. This is the controlled source baseline.emma.acme, return to #/data, and run again. Confirm only ACME rows and her approved fields arrive over the network.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.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.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.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.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.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.| Identity | Positive assertion | Mandatory negative assertion |
|---|---|---|
dana.owner | All 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.l1 | Internal 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.l2bw | Assigned BW, process-chain, transaction/telemetry operations through Confidential. | No Restricted rows; account_number is absent. |
cara.l2bobj | Assigned ticket and BOBJ operational metadata through Confidential. | No unrelated products; account_number and payload are absent. |
dev.obs | Internal Elasticsearch/pipeline telemetry within the assigned product scope. | No rows above Internal; email, account_number, and payload are absent. |
emma.acme | Only ACME rows for approved analytics products through Confidential. | Zero GLOBEX/NOVA/HELIOS/ATLAS rows; account_number is absent. |
finn.globex | Only GLOBEX rows under the same physical store through Confidential. | Zero ACME/NOVA/HELIOS/ATLAS rows; account_number is absent. |
gita.steward | The same ACME row boundary as Emma with her steward capability profile. | administer never expands tenant, product, purpose, or classification; account_number remains absent. |
hugo.admin | Policy, connector, lifecycle, role-review, and audit metadata. | Zero business records and zero implicit raw-data projection. |
iris.admin | Policy, 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.
| Gate | Evidence required | Release-blocking result |
|---|---|---|
| Authentication boundary | No 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 isolation | Positive 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 safety | Explicit 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 behavior | 100,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 performance | Fixed-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 integrity | Actor, 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. |
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.
/api/roles/apply is disabled.sessionStorage and clears on expiry/401/account switch; the local HTML entry point installs a baseline document-level CSP.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.
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.
| Window | Build objective | Exit evidence | Community 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.
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.