The dialect
The gate teaches the corpus its manners
A model's first draft arrives with the ecosystem's reflexes — a lodash import, a zod
schema, an as any to make the
red squiggle stop. The gate answers in milliseconds, with the fix in the error. This
conversation is the adoption path, and it converges because the loop is fast:
what the habit writesdeal.ts
import isEqual from "lodash-es";
import { z } from "zod";
const input = z.object({ amount: z.number() })
.parse(body);
const total = rows.reduce(sum) as any;
// three reflexes from the old world —
// each one learned from the corpus,
// each one a liability here
what the gate answers3 errors · 0 packages consulted
deal.ts:1 — "lodash-es" is not in the world.
std/iter has deepEqual.
fix: import { deepEqual } from "std/iter"
deal.ts:2 — validators are derived, not imported.
Deal already knows its shape.
fix: Deal.parse(body)
deal.ts:7 — `as any` never admits.
total is Money when rows is Line[].
fix: annotate rows: Line[]
The canonical artifact is the resource — plain TypeScript, no new syntax, and the type
system is strong enough that the derived surface is exactly typed. In TypeScript,
types are opinions that erase at runtime. In streng they are laws: every boundary type
compiles to a validator, derived from the declaration, never imported from a vendor.
erf · a resource — plain typescript, everything derivescrm/deal.ts
import { resource, states, money, pii, contact, belongsTo, by, orgScoped, role } from "std/erf";
export const Deal = resource("deal", {
stage: states("draft", "won", "lost"), // history: every version
amount: money(),
owner: pii(contact()), // vault-routed · masked by default
company: belongsTo("company"),
}, {
horizon: by("assignment"), // who syncs / sees this row
policy: orgScoped.and(role("sales")),
});
// typeof Deal.Row is exact — the compiler is the first verifier.
// Deal.parse is the derived validator — types don't erase, they enforce.
// schema, migration, history, forms, REST + OpenAPI: derived, catalogued.
taak · a durable workflow — checkpoints are rowscrm/follow-up.ts
export const followUp = workflow(async (wf, dealId: DealId) => {
await wf.step(sendIntro(dealId));
await wf.sleep(days(3)); // a row — survives deploys
const ok = await wf.receive(Approval); // waits for a human, or an agent
if (ok) await wf.step(sendContract(dealId));
});
kooi · tenant & agent code — priced, not trustedhooks.ts
const verdict = await kooi.run(tenantHook, {
capabilities: ["crm.read"], // anything else is unnameable in the environment
fuel: 1_000_000, // exact step + allocation budget
});
the whole toolchainshell
$ streng check # tsgo 7, vendored — the full graph, warm, in double-digit ms
$ streng test # the runner ships in the binary
$ streng build # ./crm — engine + stdlib + your app, one file
$ ./crm postgres://… # there is nothing to install, anywhere in this transcript