Furth FortuneEngineering reference
TECHNICAL DOCUMENTATION

2027 · MerTek technology

On this page

Engineering reference / System overview

Security and Tenancy

Deny-by-default checks at every boundary

Every request in an MTK deployment crosses five boundaries: identity, application, tenant and data, service, and device. Each boundary starts from denial and admits only what a declared grant names. A request stops at the first boundary that refuses, and the refusal names that boundary.

Worked example

A partner crew that reads one feed and nothing else

Unit 12 runs 40 service trucks for a regional utility, and its Readiness application tracks each truck's position and status. For one season a 12-person crew from Harlan Line Services works alongside Unit 12. The crew must open Readiness and read Unit 12's shared track feed. It must not write anything, and it must never see Unit 7, Unit 30 or any other tenant.

  1. Identity. Harlan's own OIDC issuer is a second binding on Readiness's crew auth domain, beside the utility's issuer. The host holds both issuers' keys, and a token's claims cannot add an issuer or choose where keys are fetched. A request with no verified sign-in reaches only public entries.

    # s/_auth/crew.tri
    auth crew {
        account = member
        methods = oidc | passkey
        enrollment = invited
    }
  2. Application. When a connection opens, the server sets its audience from its own records. Harlan's crew holds partner and nothing more. Every handler that changes data requires crew, so a partner's call to reportDefect stops at the entry with the clause name in the refusal.

    # a/audience.tri
    flagset audience { crew = 1, partner = 2, dispatcher = 4, admin = 8 }
    
    # s/defects.tri
    handle reportDefect(const ctx, u64 truck, text note) require (ctx.audience.has(audience.crew), "crew audience") {
        defect.insert({ truck = truck, note = note, reporter = ctx.auth.subject })
    }
  3. Tenant and data. Every track point carries its tenant. Members of Unit 12 read and write their own points; anyone holding Unit 12's partner relation reads them. A Harlan query for Unit 7 matches the relation on no row, and the reply looks exactly like a query for a unit that does not exist.

    # _db/troves/trackPoint.tri
    trove trackPoint {
        ref tenant tenant
        subject<crew> reporter
        u64 truck = 0
        text status = ""
    
        access (auth<crew> who) {
            read = tenant.member(who.subject) || tenant.partner(who.subject)
            insert = tenant.member(who.subject) && reporter == who.subject
            update = tenant.member(who.subject) && reporter == who.subject
            delete = tenant.admin(who.subject)
        }
    }
  4. Service. The server's lend says what the program may touch at all: the trackPoint table for rows, its change feed and its declared queries. It revokes outbound HTTP and child processes. The trove's access block then decides per caller inside that limit.

    # _grant/s.draft
    u16 schemaVersion = 1
    text[] revoke = ["t.net.http", "t.proc"]
    chest[] entryStoreSlots = [
        {
            u16 schemaVersion = 1
            text name = "trackPoint"
            text table = "readiness/trackPoint"
            text access = "readWrite"
            text[] database = ["feed", "query"]
        }
    ]
  5. Device. The crew's tablets render the feed through the host's display. A program reaches a camera, microphone or other device only through a granted call on a device set its host plan declares. Capture starts only after local consent. The Readiness client on those tablets declares no camera or microphone set, so neither ever opens.

What happened

The crew read Unit 12's feed all season. One attempt to file a defect stopped at the entry, naming crew audience, and Unit 7's tracks never appeared in a result, a count or an error. When the season ended, the utility removed the partner relation, and each open partner subscription rechecked before its next delivery and stopped.

System diagram

Every boundary must grant access

The request stops at the first refusal and records which boundary made the decision.

  1. Identity signed-in partner
  2. Application Readiness allowed
  3. Tenant + data Unit 12 tracks only
  4. Action read allowed • write refused

Inside the system

How the parts work together

Follow the data, decisions, and access boundaries. Each diagram explains a concept used by applications.

Map 01

Six deny-first checkpoints

Identity, application, tenant, data, service and device each grant on their own. A request needs all of them.

  1. Identity who
  2. Application which app
  3. Tenant + data whose records
  4. Service + device which action
  5. Decision all must grant
Map 02

Sandbox boundary

A workload receives only the folders, network paths, programs and devices its grant declares.

  1. Workload requested resource
  2. Sandbox policy declared surface
  3. Host enforcement mechanism check
  4. Grant or refusal observed result
Map 03

Capability tuple

Mechanism, tenant, tier, and policy combine into one exact grant.

  1. Mechanism operation
  2. Tenant scope
  3. Tier service level
  4. Policy conditions
  5. Capability complete grant
Map 04

Application-tier recursion

Each layer grants on its own. A grant to a parent application gives nothing inside a child application or service.

  1. User grant identity scope
  2. Application grant per app
  3. Service grant per tier
  4. Data grant per tenant
  5. Final action least privilege
Map 05

Declared or refused

Missing network, tenant, or sandbox posture is an error, not a permissive default.

  1. Required posture known fields
  2. Configuration declared values
  3. Gate complete + valid?
  4. Run or refuse no guessed default

Key parts

What the system does

These are the main boundaries, inputs, outputs, and failure rules. The examples show a specific use of each part.

Checks at every boundary

Identity, application, tenant and data, service and device each decide on their own. A pass at one boundary carries no weight at the next, and the refusal names the boundary that made it.

For example

A signed-in partner opens Readiness and still cannot read Unit 7's tracks or file a defect.

The capability tuple

A capability is a mechanism, a tenant, a tier and a policy taken together. The mechanism belongs to the platform and stays generic; tenant, tier and policy are the application's data. Tiers belong to each application, so one person can be a plain user in one application and an administrator of their own child application.

For example

Read on trackPoint, for Unit 12, at the partner audience, under the partner relation.

Declared or refused

Missing posture is an error, never a permissive default. An admitting host refuses a document of the other form, a governed trove without a protection floor refuses adoption, and an undeclared placement class denies.

For example

A Readiness release that adds an external entry without stating its admission refuses at compile.

Code

Security and Tenancy in code

Each example is short and complete enough to read on its own. Hover a dotted word for its definition.

Trident

Set the audience when a connection opens

The server computes the audience from its own member records, never from anything the client sends. A connection holds exactly the members the server granted, and every require clause and every column audience reads that set.

on event("home", const peerConnection fact) {
    if (fact.kind != "opened") { return }
    subject<crew>? who = fact.auth.subject
    if (who == null) { return }
    member? me = member.bySubject.find(who)
    if (me == null) { return }
    audience granted = audience.partner
    if (me.kind == a.people.role.crew) { granted |= audience.crew }
    t.net.peer.audience(fact.connection, granted)
    send me to fact.connection
}
Trident

Keep a whole trove from partner connections

A trove-wide audience row keeps every row from any connection that holds neither member. The server checks it per receiving connection at send time, so the same send reaches a dispatcher and skips a partner.

# _db/troves/unitRoster.tri: never sent to a partner connection
trove unitRoster {
    audience = dispatcher | admin
    ref tenant tenant
    text name = ""
    text phone = "" with { pii = true }
}
Chest

A sandbox of one folder and no network

The program reads and writes only the exports anchor, which the host places under the application's data root. Outbound HTTP and child processes are revoked. A lend that pointed an anchor at the application's own directory would refuse, because a program holds no authority over its own source.

# _grant/grant.draft
u16 schemaVersion = 1
text[] revoke = ["t.net.http", "t.proc"]
chest io = {
    u16 schemaVersion = 1
    chest[] anchors = [
        {
            u16 schemaVersion = 1
            text name = "exports"
            text access = "readWrite"
            text? leaf = null
            text root = "data"
            text directory = "exports"
        }
    ]
}
Shell

Refusals name the boundary

Both refusals stop the launch before the program's first call. The first names the revoked library, the function that reached it and the document that revoked it. The second names the anchor that would have reached the application's own files.

tricli: lend: revoked: t.proc
tricli: a.main.main reaches t.proc.spawn, and _grant/grant.draft revokes t.proc
tricli: falseStart: grant

tricli: lend: anchorReachesApplication: cwd
tricli: the anchor's directory is the application directory or holds it, and a program is lent no authority over its own source
tricli: falseStart: grant
Shell

A key needs a lent provider

This program opens a named key and compares a presented secret. The donor grant lends no security provider, so --reach lists both calls as uncovered. The program cannot launch until the host lends a provider and the lend names the credential.

$ tricli --reach claim.tri
u16 schemaVersion = 1
chest[] uncovered = [
    {
        text kind = "verb"
        text name = "key"
        text scope = "t.security.crypto"
    },
    {
        text kind = "verb"
        text name = "compare"
        text scope = "t.security.secret"
    }
]

Uses

Example uses

  • Partner and contractor access to one shared feed
  • Multi-tenant fleet and maintenance applications
  • Sandboxed services with one folder and no network
  • Least-privilege hosting of several applications on one host

Review questions

What the team must decide

Which tenants, relations and audiences each application needs

Which deployments admit a fixed library list and which revoke from the host default

Which folders, programs and network paths each service really uses

What a refusal may tell each audience, and who reads the detailed reason

Contact us
FURTH FORTUNE / ENGINEERING REFERENCEBack to top ↑