CLASPINE · REVIEWER SUMMARY

Architecture & security summary

A plain description of how Claspine is built, what its controls do, and what remains your responsibility. It reflects the product as of October 2026; the licensed repository contains the full architecture decision records and capability docs.

Forward by email Talk to us

At a glance

What it is
A commercial, source-available backend platform: 20 modules plus a starter application and AI-agent rule files.
Runtime
Java 17 or newer (tested on 17, 21 and 25), Spring Boot 3.5. Runs as a normal Spring Boot service on any cloud or on-premises. Other languages and frameworks use the engine image over HTTP.
Shape
In-process modular monolith. No sidecar or network hop between your product and the platform.
Platform state
PostgreSQL (32 spine_platform_* tables over plain JDBC), MongoDB-compatible stores (Atlas, AWS DocumentDB, Azure Cosmos DB Mongo API) or Google Firestore, selected with platform.persistence.type. Tables and collections are prefixed platform_.
Your data
Independent of the platform. Use any database. In Java, use JDBC, jOOQ, MyBatis or JPA through EntityManager (Spring Data repositories are blocked by the guardrail); in a shared PostgreSQL database your tables are never touched.
Delivery
Starter repository as source; platform core as versioned Maven artifacts with line numbers and debugging symbols, not obfuscated.
TypeScript / Node
Open-source client @grahmur-org/claspine-client (Apache-2.0) for authentication, permissions, audit, notifications and host resolution. It calls a Claspine engine service over HTTP; other languages can use the REST APIs directly.
Licensor
GRAHMUR OÜ, under a Commercial License Agreement.

Structure and boundaries

Products define what the business does; the platform decides how infrastructure concerns are handled. There are three layers, and each one may only depend on the one beneath it.

Three-layer architecture Layer 3 is the runnable Spring Boot application. Layer 2 is your product composition. Layer 1 is the platform core, split into an open api package and sealed internal and persistence packages. Arrows show that dependencies point downward and products reach the platform only through api. Layer 3 · Runnable application Spring Boot app: controllers, filters, configuration, wiring Layer 2 · Your product composition Domain logic and adapters. Checked by ProductBoundaryTest. Layer 1 · Platform core (20 modules) api · open door internal · sealed persistence · sealed
Dependencies point downward. Products consume api and the shared foundation types only.
  • Every module has the same package layout: api (public contracts), internal (services and validators), persistence (stores), and an auto-configuration class that can be switched off per module.
  • Public APIs are decoupled. They accept and return shared foundation types (account, actor, product, idempotency and correlation IDs), not authentication-specific types, so a module can be used without adopting unrelated modules.
  • Tenancy is optional. A first-party product is not forced into a synthetic tenant; organization scope is used only when a product needs it.
  • Mutations are idempotent. Mutating platform operations take an idempotency key.

Guardrails: what the build enforces

Claspine ships its guardrails as a library (grahmur-platform-guardrails). ProductBoundaryTest applies them to every class your build compiles, in every module and package:

@AnalyzeClasses(locations = SpineGuardrails.ProjectClasses.class,
        importOptions = ImportOption.DoNotIncludeTests.class)
class ProductBoundaryTest {
    // no internal / persistence / Spring Data dependencies,
    // no Class.forName, loadClass, setAccessible or privateLookupIn
    @ArchTest
    static final ArchTests spine_guardrails = ArchTests.in(SpineGuardrails.class);

    // no SQL naming spine_platform_* tables, no classes in com.grahmur.platform,
    // no @ArchIgnore or ArchUnit ignore files
    @Test
    void repository_has_no_guardrail_violations() {
        SpineSourceGuardrails.assertClean(SpineSourceGuardrails.projectRoot());
    }
}

The starter runs this test in its own build step whose switches are fixed in the POM, so -DskipTests, -Dmaven.test.skip and -Dtest=… do not skip it and deleting it fails the build. A CI workflow checks that every module ran it, and CODEOWNERS plus branch protection make any change to guardrail files need an owner’s approval. For JS/TS code, @grahmur-org/eslint-plugin-claspine fails lint on hardcoded or client-exposed secrets, SQL concatenation, unscoped tenant queries, secrets in logs and buffered uploads.

Claspine enforces the data boundary itself, even in projects that never added this test. At runtime the application’s own database connections refuse any query, write, aggregation stage or command that names one of Claspine’s tables; a staging or production start stops when the application’s compiled code names them; and every test run with Claspine on the classpath fails on them. There is no switch to turn this off. Claspine’s own code uses separate, unguarded connections. This covers PostgreSQL, MongoDB and Firestore. Deliberate workarounds (unwrapping a JDBC connection, reflection) are outside what a library can stop; a separate database user for Claspine is the hard stop, and we recommend it for production.

Inside the platform, further architecture tests keep provider SDK types out of module APIs and confine sensitive cryptographic primitives (java.security.Signature) to a short list of named packages.

Who covers what
ConcernBuild guardrailPlatform moduleYou
Product bypasses platform contractsFails ./mvnw test (cannot be skipped from the command line)Runtime guard on the application’s connections; production will not start with such code; optional separate database user for platform data (PostgreSQL, MongoDB, Firestore)Turn on branch protection and code-owner review
Common insecure shortcuts (JS/TS)ESLint rules fail lint—Run the plugin in CI
Secret handling—Opaque references; redaction before logging or persistenceManage the underlying secret store and rotation policy
Session security—Deployment-bound opaque sessionsChoose and configure the identity provider
Audit trail—Fail-closed, hash-chained append with key and value redactionDefine event types, retention and review; record chain heads externally
Agent keys and spend (Claspine Atlas)—Scoped, expiring keys with per-key token caps; atomic budgets; rate limits; revoke-allIssue one narrow key per agent
Business-logic flawsNot coveredNot coveredCode review and testing

Security controls by module

Authentication

  • Sessions are opaque, server-side and bound to one deployment; only a digest is persisted.
  • Provider credentials are verified (signature, issuer, audience, expiry) by the deployment’s bound verifier. The Firebase verifier uses JDK security primitives, with no external JOSE library.
  • Every failure class returns the same empty result, so callers cannot enumerate reasons.
  • The sandbox verifier cannot be enabled in staging or production.
  • Cookie transport requires SameSite and a custom header on mutating requests.

Authorization

  • Decisions use exact runtime context (product, optional organization, deployment).
  • Permissions are direct grants that can be revoked and restored.
  • Host resolution is deny-safe: an unknown host does not fall through to a default deployment.

Secrets and credentials

  • The platform persists opaque secret references, never credential values.
  • Claspine Atlas vault secrets can use envelope encryption: a data key per secret, wrapped by an Azure Key Vault key that never leaves Key Vault.
  • Material is retrieved only at the adapter boundary using short-lived workload identity.
  • Request, audit, provider and error data are redacted before persistence or logging.

Audit

  • Fail-closed: if the audit store rejects an event, the operation does not proceed.
  • Tamper-evident: events form a hash chain per product (HMAC with an integrity key you hold); verification reports the first edited, missing or reordered event.
  • Credential-named keys are rejected; credentials in values (bearer tokens, JWTs, provider keys, URL passwords) are redacted. Actor names and PII are excluded by design.
  • Queries require exact product and optional organization scope, with bounded result sizes.

Agent keys (Claspine Atlas)

  • Keys carry only the scopes they were issued with (files:read, files:write, llm:complete), may expire, and may have their own monthly LLM token cap.
  • LLM spend is reserved atomically before each call, so parallel agents cannot overshoot a budget; a per-minute limit and an input-size cap apply first.
  • One action revokes every key of a project.

Files

  • Presigned uploads and downloads for S3, GCS and Azure Blob: bytes go directly between the client and cloud storage, not through your application memory.

Provisioning

  • The platform dispatches infrastructure work through GitHub Actions and verifies it through provider APIs; it does not run Terraform or store uploads itself.
  • CI callback tokens are single-use, deployment-scoped and stored as SHA-256 digests; replay is denied.

Compliance posture and shared responsibility

Compliance-ready, not certified. Claspine provides controls that support HIPAA, SOC 2 and GDPR programs (fail-closed audit, secret scrubbing, deployment-bound sessions). It is compliance-ready, not certified: using Claspine does not by itself make a product compliant, and your organization remains responsible for its own compliance.

Programs Claspine’s controls are designed to support
ProgramWhat Claspine providesWhat you still own
HIPAAAudit trail, access control, secret hygiene, session securityBusiness associate agreements, risk assessment, PHI handling policies, hosting configuration
SOC 2Evidence-friendly audit events and enforced architecture boundariesThe audit itself, organizational controls, change management and monitoring
GDPRScoped data access, audit trail, no PII in audit attributes by designLawful basis, data-subject requests, retention and deletion, processor agreements

Known limits

So nobody is surprised in a review, these are deliberately outside the platform today:

  • Platform-native passwords, one-time codes, MFA and account recovery: these are delegated to your identity provider.
  • Audit retention or deletion scheduling, export procedures and alerting integrations.
  • Field-level before/after change tracking in audit events.
  • The Node.js client covers files, AI routing and payments (plus auth, permissions, audit and notifications) and needs a running Claspine engine service or a Claspine Atlas project; no prebuilt container image is published yet.
  • Automated PostgreSQL store tests mostly run against H2 in PostgreSQL mode (agent-control and audit-chain SQL is also tested on PostgreSQL 16); validate your target managed service in your own environment.
  • Reviewing your business logic. The guardrails check dependencies and common shapes of insecure code, not intent or data flow.
  • Database-level isolation of platform data (a separate platform user on PostgreSQL, MongoDB or Firestore) is optional and off by default; it stops accidental shortcuts by your code, not deliberately malicious code inside your own application.
  • Guardrail files can still be changed by anyone with write access; branch protection and code-owner review are what make such a change visible.
  • Agent Shield in the Claspine Atlas console is a heuristic preview scanner; a clean result is not proof of safety.
  • Agent keys have scopes, budgets and expiry, but there are no human-approval gates for individual agent actions yet.
  • Deleting the newest audit events is only detectable against a chain head you recorded outside Claspine.

Next steps

Questions from your security team, or need the full architecture decision records for a review? Get in touch, or go back to the overview and pricing.