philipgreat's picture
Deploy traceable order management playground
aa89cb5 verified
|
Raw History Blame Contribute Delete
3.72 kB
<!-- ephemeral -->
# TypeScript Assist — Create `Customer`
Use the exact generated `Q.customers()` entry point. The
trusted `UserContext` supplies actor, tenant, policy, provider, and audit sink;
none of those values may be accepted from the writable input.
```typescript
import { UserContext } from '../teaql-ts';
import { Q } from './Q';
import { Customer } from './models/Customer';
export interface CreateCustomerInput {
platform: string | number;
name: string;
}
export async function createCustomer(
input: CreateCustomerInput,
context: UserContext,
): Promise<Customer> {
const entity = Q.customers()
.comment('what: initialize Customer')
.purpose('why: create Customer')
.newEntity(context);
entity.updatePlatform(input.platform);
entity.updateName(input.name);
await entity
.auditAs('Create Customer for the requested business operation')
.save(context);
return entity;
}
```
Only the generated updater methods above are writable. Constant relation
candidates, when present, are also generated and must be copied exactly:
Compile the result unchanged. Test persistence and query-back, and prove that
blank/missing intent, blank/missing audit reason, unknown fields, and attempted
trusted-context overrides fail. Do not edit generated sources.
---
## TeaQL seven-language assist contract
Apply the verified Rust semantic ceiling while using only the exact TYPESCRIPT generated and
runtime APIs. Discover APIs through the generated application AGENTS.md and progressive
model-aware Assist. Do not inspect generated domain-library source.
- Do not create plurals by appending `s` or `es`; use the centralized generated plural.
- Human and non-human entities use different generated predicate vocabularies. Preserve
forms such as “who are active” and “whose email is”; never infer them from English.
- Configure filters, projection, paging, and other query options before `purpose(...)`.
Comment may appear anywhere in the chain. Purpose enters the executable stage; execution
requires both values, but comment does not have to immediately precede purpose.
- Every execute/list/stream and every save accepts exactly one context argument:
`UserContext`. Name that argument `context`, never `runtime`; data services and global
policy are injected when the context is built. Reserve `runtime` for process-level
runtime ownership, provider/pool setup, and module assembly.
- Tenant, merchant, identity, permissions, request policy, purpose policy, hard limit,
and continuous-page cursor policy come only from trusted context, never dynamic JSON or TFP.
- If the required operation is absent after current entity/action and required field
Assist, stop that path and report MISSING_ASSIST. Do not guess an API or search the
generated library as a fallback.
- Create each application-owned source file once. After its first compile attempt,
repair only the smallest block identified by the exact compiler or test diagnostic.
Preserve unrelated code; do not rewrite the complete file as an error-recovery loop.
- Before a repair that would replace more than 25% of an existing application file,
stop and report LARGE_REWRITE_REQUEST with the file, exact diagnostic, reason, and
estimated scope. Initial creation and model-driven regeneration are not repairs.
Capability: `create`.
- Validate and allow-list writable business fields; never mass-assign dynamic JSON.
- Create through the generated request/entity API, attach a non-empty audit reason,
save with the same UserContext, and return the runtime's native save result.
- Add a negative test proving a missing audit reason cannot write.