Skip to main content

09 — Tool pattern library.

The Logic Plane exposes capability to agents and humans only as tools: typed, versioned, idempotent, permissioned, audited, eval-gated functions. There are no “skills,” no “abilities,” no “loose-text actions.” Every capability fits one of ten patterns. This section is the contract.

9.1 Universal contract

Every tool, regardless of pattern, satisfies the same six contract clauses:

9.2 Side-effect taxonomy

Tools are classified by their effect class. The PDP and the Action Plane treat each class differently.

9.3 Pattern catalog

Ten patterns. Together they cover every capability a tenant ever needs to expose. Specific tools are tenant artefacts; this documentation defines only the patterns.

Pattern 1 · Extraction

effect: pureLifts a typed Property out of a source artefact (document, email, structured payload). Produces both the value and the EvidenceSpan that justifies it.

Shape

extract<TargetProperty>(source: SourceRef, hints?: Hints) → { value: TargetProperty, evidence: EvidenceSpan, confidence: number }

Schema skeleton

Side-effects: none. Governance: read-internal scope on the source. Observability: emits tool.extract.dispatch + tool.extract.result spans with model lineage.

Pattern 2 · Lookup

effect: read-externalResolves an identifier to an authoritative record from a system of record or a registry.

Shape

lookup<TargetObject>(identifier: string, source: SoRRef, asOf?: datetime) → TargetObject | NotFoundSide-effects: none. Governance: declared SoR scope + purpose tag. Cached per (identifier, sourceVersion) for the run; cache invalidated by source-version change.Failure modes: not_found, source_unavailable, permission_denied, stale_replica. Each produces a typed Exception.

Pattern 3 · Validation

effect: pureRuns a candidate value (or candidate Object) against a typed ruleset and returns a verdict plus a rule-trace.

Shape

validate(candidate: any, rulePack: RulePackRef, ontologyPin?: string) → { verdict: 'pass'|'warn'|'block', trace: RuleTrace[] }Rule packs are themselves versioned; verdicts are reproducible given (rulePackVersion, candidate). Validation is bit-exact and is the basis for the Verifier (§11).

Pattern 4 · Classification

effect: pureMaps a typed subject into a typed band: severity, fast-track eligibility, jurisdiction class, risk tier, document type, intent type, etc.

Shape

classify<Subject, Band>(subject: Subject, schema: ClassificationSchemaRef) → { band: Band, confidence: number, rationale: string, evidence: EvidenceSpan[] }Classifications must declare an exhaustive band set; out-of-band cases produce an Exception of kind classify.out_of_distribution rather than a default band.

Pattern 5 · Composition

effect: pureAssembles a typed draft Object from typed parts plus typed templates. Used to draft Submissions, Quotes, Endorsement requests, loss-notice drafts, correspondence — all before any Action Plane staging.

Shape

compose<Draft>(parts: PartSet, template: TemplateRef) → DraftOutput is always a draft: it is never persisted as a live Object. Persistence requires the Action Plane.

Pattern 6 · Action-staging

effect: stageTranslates a typed effect intent into an Action in state staged. Issues an idempotency key, attaches the authoring Decision, and enqueues the Action for approval and commit.

Shape

stage(action: { kind, targetSor, targetRef?, payload }, idempotencyKey?: string) → ActionRe-invocation with the same idempotency key returns the existing Action; never produces a duplicate. Action-staging is the only path from reasoning to commit (§14).

Pattern 7 · Approval-request

effect: commit-lowCreates a Task addressed to a queue or named principal, requesting human approval for a staged Action or a Decision. Carries the subject, the rationale, the cited evidence, and the SLA.

Shape

requestApproval(subject: Ref<Decision|Action>, queue: string, sla?: Duration) → TaskApprovals are themselves Decisions (kind approval.granted | approval.denied) and are linked back to the original Action.

Pattern 8 · Aggregation

effect: read-internalComputes a typed metric over a window of Objects: portfolio exposure, queue depth, claim frequency, recovery ratio, etc. Used as input to other tools or for surface rendering.

Shape

aggregate<Metric>(objects: Ref[], window: Window, op: AggOp) → MetricAggregations declare and enforce marking propagation: a metric over PII-marked rows is itself PII-marked.

Pattern 9 · Conversion / Arithmetic

effect: purePure deterministic transforms: currency conversion (with rate-source pin), date arithmetic, unit conversion, hash, tabulation. Bit-exact, replayable, never network-dependent at run time except through resolved-and-pinned rate sources.

Shape

convert<In, Out>(value: In, target: TargetSpec) → OutRate sources used for currency / unit conversion are pinned at run start; replay uses the same pin.

Pattern 10 · Search / Retrieval

effect: read-internalReturns a ranked list of EvidenceSpans matching a query against an indexed corpus. The retrieval snapshot id is recorded; downstream EvidenceSpans back-reference it.

Shape

search(query: Query, corpus: CorpusRef, k: int) → { spans: EvidenceSpan[], retrievalSnapshotId: string }Marking propagation: results inherit corpus marking; queries with insufficient clearance are rejected at the PDP, not silently filtered.

9.4 What is not a tool

  • Free-text “do whatever” prompts: forbidden.
  • Direct database access from agents: forbidden.
  • SoR writes outside the Action Plane: forbidden.
  • Network access from inside reasoning sandbox: forbidden.
  • Holding state across runs in tool memory: forbidden.

9.5 Tool registry record

9.6 Per-tool observability

Every dispatch emits the following spans and metrics (see §18):
  • tool.<name>.dispatch — caller, scopes, args hash, idempotency key, PDP verdict.
  • tool.<name>.run — duration, retry count, downstream span links.
  • tool.<name>.result — outcome, result hash, exceptions emitted.
  • Metrics: throughput · success_ratio · p50 · p99 · error_class_distribution · cost_per_call.