What your AI assistant can do in Whathappensify
Your AI assistant can't run a simulation itself. It works in Whathappensify through the Model Context Protocol (MCP), the standard way AI assistants use tools that live outside them. Everything the assistant does for you here goes through this service.
What the assistant can do for you
- Start a simulation from a question you ask.
- Build a starting world for a place you name.
- Write a scenario proposal: the place, the change you want to try, the data and the assumptions.
- Propose a variant of an existing scenario that changes only what it lists.
- Propose continuing a finished run from where it ended, or from a saved point partway through.
- Propose a sweep: the same scenario run several times with different values, listed one by one.
- Propose a watch that tells you when a measure crosses a threshold.
- After you approve, generate the scenario and run it.
- Pick up a simulation later, exactly where it stopped.
What only you can do
Every scenario, variant, continuation, sweep and watch waits for you to approve it in your browser, and your approval covers that exact version. A sweep shows you every variant and the total number of runs before you approve it. If anything changes after you approve, you are asked again.
Moving a simulation to the trash can be undone. The assistant cannot delete anything permanently.
The ten reasoning tools
CHECK
Measures conditions.
- Values from a finished run.
- Where a named place is.
- How dense something is in an area.
- A field, such as heat or water depth.
- The flow of people or vehicles.
SEEK
Tracks things across time and space.
- Results in time order.
- The best route between two points.
- How far you can get in a given time.
- Trips between areas.
MONITOR
Follows what is happening.
- How far a run has got.
- Watches you have approved.
- Trends over time.
- Whether a model has drifted away from what is observed.
- The state of a running simulation, read without moving it forward.
IMAGINE
Works with alternatives.
- Reading one result under the conditions it was produced in.
- Creating a variant of a scenario.
EXPLORE
Runs simulations.
- For a set length of simulated time.
- With saved points to continue from.
- Stopping when a measured condition is met.
- Continued from an earlier run.
- As an approved sweep.
COMPARE
Puts results side by side.
- Two runs.
- A set of scenarios, by average, total, lowest, highest or 95th percentile.
- Two exact moments in a run.
- The options where no other option does better on every goal.
EXPLAIN
Looks at causes.
- Whether a diagram of causes lets an effect be identified.
- How much each factor contributes.
- The effect of a change inside a model.
- Effects estimated from observed data.
- Simulated and observed estimates combined.
GAUGE
Measures uncertainty.
- The spread across runs.
- Intervals from resampling, including resampling in blocks of time or space.
- Intervals from a fitted distribution.
- Ensembles of runs.
- How results respond when parameters change.
- Differences between paired runs.
- Calibration against observations.
CHOOSE
Helps pick among options against goals you state.
- Ranking results.
- Searching a grid of options.
- Random sampling.
- Weighted scores.
- The best tradeoffs between several goals.
- A search that learns where to try next.
- A search that plans for bad cases.
- Options that differ from each other.
- Continuous minimization within limits.
ADAPT
Proposes updates from evidence.
- Copying one value from a result.
- Combining observations with an earlier estimate.
- Recalibrating a model's parameters.
Each cause is reported only when its method's conditions are met. A search that needs runs you have not approved asks you first. A proposal from ADAPT never applies itself.
Built on the software development kit
The software development kit (SDK) is the platform's own code for these ten kinds of reasoning. The MCP tools run that same code, so an assistant and a developer get the same calculation. Every reasoning method the SDK has, your assistant has through MCP. What differs is the checks on who is asking and what they have approved.
What every result carries
Each result keeps the inputs, the method and the sources it came from, and states how strong a claim it supports. A simulation result holds under its stated conditions. It is not a measurement of the real world.
Optional Frames record what a person cares about and read a result that way, without changing it.
When the service cannot support a claim, it refuses, says why, and suggests what to do instead.
Full reference
Every operation of the MCP service, on the agent endpoint and the control endpoint, with what the assistant gives it, what comes back and its limits.
CHECK (measure conditions)
Strongest claim: OBS:CS1 (an observation from a model, at most claim strength 1)
| Operation | The assistant gives it | It returns | Limits |
|---|---|---|---|
CHECK.measurements (values from a finished run) | receipt_ref; measurements: 1 to 10 pairs of node_id and metric. | Each value with its unit and the exact saved field it came from, and a saved result. | Model output under stated conditions, not a field observation. |
CHECK.location (where a named place is) | Place text. | The matching place or places, with the provider and source that resolved them. | Never picks a city on its own; an ambiguous name is reported as ambiguous, not guessed. |
CHECK.density (how dense something is in an area) | An owned data source reference; region or place; valid time; resolution; entity and source category; optional Frame. | Counts per area in declared units, for example 10 in an area of 2 as 5, with the exact rows used. | Missing data is reported as missing, never as zero. |
CHECK.field (a quantity spread over space, such as heat or water depth) | An owned data source reference; region or place; field; valid time; resolution; optional Frame. | Field values in declared units with the source version they came from. | Binding a source does not establish that it is physically accurate. |
CHECK.flow (movement of people or vehicles) | An owned data source reference; region or place; valid time; resolution; entity; optional Frame. | Flow vectors with magnitude computed from components, for example (3, 4) as 5. | An empty selection is distinct from an observed zero. |
CHECK.frame_reading (a result read through a Frame) | A saved result; one or more Frames the person can read. | Per Frame: the criteria evaluated, and which were met, not met, or not evaluated. | The physical values and their evidence stay identical with or without a Frame. |
SEEK (track things across time and space)
Strongest claim: OBS:CS1 (an observation from a model, at most claim strength 1)
| Operation | The assistant gives it | It returns | Limits |
|---|---|---|---|
SEEK.timeline (results in time order) | receipt_refs: 2 to 10; node_id; metric. | Points ordered by run completion time, each with its run, unit and source field. | Completion order is not real-world observation time, and no trend is claimed. |
SEEK.route (the best route between two points) | A world the person built; origin; destination; objective (time or distance). | Travel time, distance and the path, with path detail up to 60 edges. | Travel by car only; a departure time, other travel modes and a safety objective are refused, not ignored. |
SEEK.reach (how far you can get in a given time) | A world the person built; a starting point; one or more time budgets. | The places reachable within each budget, with detail up to 30 places. | A foreign world, changed data or a changed edge cost is refused before calculation. |
SEEK.flows (trips between areas) | A saved run or an owned data source; origin and destination areas; valid time; limit. | Trip counts for each origin, destination and time window, counted independently. | Observed flows require a bound data source. |
MONITOR (follow what is happening)
Strongest claim: OBS:CS1 (an observation, at most claim strength 1)
| Operation | The assistant gives it | It returns | Limits |
|---|---|---|---|
MONITOR.status (how far a run has got) | run_ref. | State (reserved, running, complete or failed), revision, time observed, when to check again, and the receipt or failure code. | Read only; it starts nothing and infers no current run. |
MONITOR.state (the state of a running simulation) | An explicit scenario; the fields to include. | The requested state fields at the current tick. | Reading never advances the simulation, dispatches agents or changes its queue. |
MONITOR.events (what happened in a simulation) | An explicit scenario; an event cursor. | The next page of events after the cursor. | Read only; raw agent-state disclosure stays restricted. |
MONITOR.context (the surroundings of a simulation) | An explicit scenario. | The context the simulation runs in. | Read only. |
MONITOR.watches (the person's watches) | Optional filters by metric, region or scenario. | The person's active watches and their state. | Lists only the person's own watches; another tenant's watches are invisible. |
MONITOR.trend (a trend over time) | Metric; region; history window; optional crossing threshold; optional Frame. | The trend over the selected window and any threshold crossing. | The selected window is the one used; a different window gives a different trend. |
MONITOR.drift (whether a model has moved away from what is observed) | Domain; residual series; model and place scope; baseline; method thresholds (CUSUM, cumulative sum, or ADWIN, adaptive windowing); validation age. | Whether drift was detected, when, and by how much. | Needs a bound observation source and a stated baseline. |
IMAGINE (work with alternatives)
Strongest claim: INT:CS2 (an interpretation, at most claim strength 2)
| Operation | The assistant gives it | It returns | Limits |
|---|---|---|---|
IMAGINE.conditional (one result read under the conditions it was produced in) | comparison_ref; metric. | Left and right values, unit, the change, and the exact runs behind them. | Creates no scenario and no run, and cannot raise the strength of the comparison. |
EXPLORE (run simulations)
Strongest claim: INT:CS2 (an interpretation, at most claim strength 2)
| Operation | The assistant gives it | It returns | Limits |
|---|---|---|---|
EXPLORE.start (run an approved scenario) | manifest_ref of the approved, generated scenario; idempotency_key; duration in ticks or simulated time; checkpoints; halt conditions on measured values; seed. | Run reference and state, source world, provenance, and the browser address where the person watches it. | Runs only what the person approved. The same retry key returns the original run. |
EXPLORE.continue (continue an approved continuation) | The generated continuation; idempotency_key. | A new run that starts from the carried-over tick and state, with the source run and seed continuation recorded. | The source run is never modified; both runs are kept. |
EXPLORE.sweep (run an approved sweep) | The generated sweep; idempotency_key. | One run per approved variant, each with its own reference, linked to the sweep. | Starts exactly the approved variants and no others. |
COMPARE (put results side by side)
Strongest claim: RSN:CS3 (reasoning, at most claim strength 3)
| Operation | The assistant gives it | It returns | Limits |
|---|---|---|---|
COMPARE.receipts (two runs, or two places in one run) | left and right: receipt and node; metrics: 1 to 10. | Values, units, absolute and relative differences, and the verified source of each value. | A controlled pair (only the declared change differs) supports a comparison of the two computations, not a cause. |
COMPARE.scenarios (a set of scenarios) | Scenario or run set; metrics; aggregation (mean, sum, minimum, maximum or 95th percentile). | The aggregate per scenario, for example [1, 2, 9] as mean 4, sum 12 and 95th percentile 8.3. | Statistical significance is reported only with a valid sampling or pairing design. |
COMPARE.states (two exact moments) | Exact scenario, run, node and tick references; metric; statistical method. | The values at those exact moments and their difference. | A tick is never read as a node. |
COMPARE.pareto (the Pareto frontier (options where no other option does better on every goal)) | Candidates; objective metrics; minimize or maximize for each. | The frontier set, with ties and missing objectives reported. | Sorting candidates does not give a causal grade. |
EXPLAIN (look at causes)
Strongest claim: RSN:CS3 (reasoning, at most claim strength 3)
| Operation | The assistant gives it | It returns | Limits |
|---|---|---|---|
EXPLAIN.structure (whether a diagram of causes lets an effect be identified) | comparison_ref; metric; treatment; outcome; nodes and edges; optional unobserved edges and confounders. | Graph digest, whether the effect is identified, the adjustment set and the reason. | No numerical effect; the diagram is an assumption, not established fact. |
EXPLAIN.attribute (factor attribution (how much each factor contributes)) | Outcome; observed and baseline values; factors; intervention type; a typed target reference; optional Frame. | Each factor's contribution and whether the selected target was used. | Descriptive contrasts keep non-causal labels and invent no uncertainty. |
EXPLAIN.decompose (simulation contrast and decomposition (splitting a simulated difference into parts)) | A comparison; a graph; factor contrasts; treatment selector; optional qualified uncertainty result. | The raw factor contrasts and any unresolved remainder. | Summary values alone do not establish an average causal effect. |
EXPLAIN.model_effect (the effect of a change inside a model) | A registered model, intervention and outcome, for example Y = 2X + Z with X from 1 to 3 and Z fixed. | The conditional effect, 4 in that example, with the model, intervention and outputs recorded. | Holds only for that model; it does not qualify other models. |
EXPLAIN.observational (an effect estimated from observed data) | Identification strategy; treatment and outcome; bound observations; adjustment set; stated assumptions. | The estimate for the exact estimand. | Reported only when the method's identification conditions are met. |
EXPLAIN.coalition (coalition attribution (Shapley values: each factor's share across all combinations)) | The actual evaluations of every factor combination. | The exact allocation to each factor. | Needs real evaluations of the combinations, never assumed weights. |
EXPLAIN.hybrid (simulated and observed estimates combined) | Compatible qualified estimates; their covariance or dependence; the estimand. | The combined estimate. | Refused without stated dependence between the estimates. |
GAUGE (measure uncertainty)
Strongest claim: RSN:CS3 (reasoning, at most claim strength 3)
| Operation | The assistant gives it | It returns | Limits |
|---|---|---|---|
GAUGE.spread (the spread across runs) | receipt_refs: 2 to 10; node_id; metric; central_fraction. | Sample count, mean, lower and upper values by linear empirical percentiles. | Descriptive only; not a confidence interval or prediction. |
GAUGE.assess method=bootstrap (bootstrap (intervals from resampling the results)) | Target; confidence levels; seed; resample count. | Intervals at each confidence level. | Resampling indices come from the recorded seed. |
GAUGE.assess method=block_bootstrap (block bootstrap (resampling in blocks of time)) | Target; block size or its justified selection; confidence levels; seed. | Intervals that keep neighbouring values together. | The grouping used is the grouping declared. |
GAUGE.assess method=parametric_interval (parametric interval (an interval from a fitted distribution)) | Target; distribution and parameters; confidence levels. | Intervals from the stated distribution. | Only as good as the stated distribution. |
GAUGE.assess method=mc_ensemble (Monte Carlo ensemble (many runs with varied random draws)) | Ensemble members; confidence levels; seed lineage. | Intervals across the ensemble members. | Members must be compatible runs of the same target. |
GAUGE.assess method=parameter_perturbation (parameter perturbation (varying inputs to see the effect on results)) | Parameter values or ranges; response metric; seed. | How the response changes across the perturbed values. | Covers only the stated ranges. |
GAUGE.assess method=sensitivity_analysis (sensitivity analysis (which inputs matter most, one at a time or by Morris screening)) | Parameter set; response; method options. | Sensitivity of the response to each parameter. | Needs a declared response. |
GAUGE.assess method=paired_delta_ensemble (paired-difference ensemble (differences between matched runs)) | Paired members; metric; confidence levels. | Intervals for the paired differences. | A missing partner is never treated as an unpaired sample. |
GAUGE.assess method=spatial_ensemble (spatial ensemble (variation across places)) | Geometry or grid; metric; confidence levels. | Intervals per area. | Areas must match the declared geometry. |
GAUGE.assess method=spatial_bootstrap (spatial bootstrap (resampling in blocks of space)) | Spatial blocks or neighbourhood; confidence levels; seed. | Intervals that keep neighbouring places together. | The spatial grouping used is the grouping declared. |
GAUGE.assess method=observational_bootstrap (observational bootstrap (resampling observed data)) | Bound observations; confidence levels; seed; grouping where required. | Intervals for the observed quantity. | Needs a bound observation source. |
GAUGE.assess method=observational_ensemble (observational ensemble (variation across observation sets)) | Observation sets; metric; confidence levels. | Intervals across the observation sets. | Needs bound observation sources. |
GAUGE.assess method=pass_through (pass-through (keeping an already qualified result)) | An exact attributed result with its qualification. | The same result and qualification. | Adds no evidence. |
GAUGE.validate method=calibration (calibration (checking predictions against held-out observations)) | Predictions; bound observations; domain and place; calibration method. | Errors and coverage computed from the actual predictions and observations. | Establishes calibration for that domain and place only. |
GAUGE.validate method=inline_calibration (inline calibration (calibration within the same analysis)) | Predictions; bound observations; domain and place. | Errors and coverage for this analysis. | Kept distinct from calibration against held-out observations. |
CHOOSE (pick among options against goals the person states)
Strongest claim: ACT:CS4 (a recommendation to act, at most claim strength 4, at least 3)
| Operation | The assistant gives it | It returns | Limits |
|---|---|---|---|
CHOOSE.rank (rank compared results) | comparison_ref; metric; direction (minimize or maximize); optional minimum and maximum. | Feasible candidates and the selected ones, with ties kept. | Needs qualified causal support; identical values without it do not meet the minimum for a recommendation. |
CHOOSE.search method=grid_search (grid search (trying every combination on a grid)) | Variable grids; objectives; constraints; approved search scope; budget. | The best candidate found, its objective values, constraints met, and every evaluation's source. | Reports the verified search scope, not a global optimum. |
CHOOSE.search method=random_search (random search (sampling options at random)) | Ranges; seed; maximum evaluations; approved search scope. | The best candidate found and the evaluations attempted. | Seeded and bounded by the budget. |
CHOOSE.search method=weighted_sum_enum (weighted-sum enumeration (scoring each option by weighted goals)) | Finite candidates; objective weights and directions; constraints. | Candidates ordered by weighted score. | Weights are the person's stated priorities, not evidence. |
CHOOSE.search method=nsga2 (NSGA-II (a genetic algorithm that finds the best tradeoffs between goals)) | Two or more objectives; population and generations derived from the budget; seed; approved search scope. | The tradeoff set found. | Not claimed to be the complete frontier after bounded sampling. |
CHOOSE.search method=bayesian_opt (Bayesian optimization (a search that learns where to try next)) | Continuous variables; one objective; initial and iteration budget; seed; approved search scope. | The best candidate found and every evaluation. | Bounded by the budget. |
CHOOSE.search method=robust_opt (robust optimization (choosing options that hold up in bad cases, using CVaR, conditional value at risk)) | Intervals; risk preference; alpha; seed; budget; a compatible uncertainty result. | The option that does best under the stated risk measure. | Uses the exact uncertainty result, never the first number available. |
CHOOSE.search method=qd_search (quality-diversity search (MAP-Elites: good options that differ from each other)) | Behaviour descriptors and value spaces; seed; budget; approved search scope. | An archive of the best option in each region of behaviour. | Bounded by the budget. |
CHOOSE.search method=scipy_minimize (continuous minimization (finding the lowest value within limits)) | Continuous variables; objective; bounds and constraints; approved search scope. | The minimum found, the solver and its options. | Reports the solver's result within the stated bounds. |
ADAPT (propose updates from evidence)
Strongest claim: LRN:CS3 (learning, at most claim strength 3)
| Operation | The assistant gives it | It returns | Limits |
|---|---|---|---|
ADAPT.propose_value (copy one value from a result into a proposal) | evidence_ref; source_path; target. | The copied value, the evidence digest and path, and canonical_state_changed = false. | Never applies itself and infers no posterior. |
ADAPT.reconcile method=weighted_mean (weighted mean (combining observations with a prior estimate)) | Independent scalar observations with standard deviations; optional prior. | A proposed value and its uncertainty, for example prior 10 (SD 2) and observation 14 (SD 2) as 12 with variance 2. | The prior is unchanged; zero uncertainty is refused. |
ADAPT.reconcile method=enkf_scalar (ensemble Kalman filter (updating one estimate from observations)) | Scalar prior; observations; uncertainties; ensemble size; seed. | A proposed updated estimate and spread. | One scalar state only. |
ADAPT.propose_calibration (model recalibration proposal (proposed new model parameters)) | Model; parameters; minimum observation count; method. | Proposed parameter values with the observations used. | Applying a proposal is the person's separate act. |
resolve (look things up)
| Operation | The assistant gives it | It returns | Limits |
|---|---|---|---|
resolve.operations (find operations) | Optional query and domain; limit 1 to 10; cursor. | Matching operations with purpose, effect and where to read their help. | A search miss is not proof an operation is unavailable. |
resolve.operation_help (the exact contract of one operation) | operation_id; optional known_digest; detail. | The exact input and output contract and an example, or 'unchanged' for a known digest. | Cached help is not cached permission. |
resolve.schema_section (one section of a large schema) | operation_id; schema_kind (input or output); path; contract_digest; cursor. | The requested section without loss. | Keep the same contract digest while assembling sections. |
resolve.reference (a saved record by its reference) | reference; representation (summary or section); path; limit 1 to 10; cursor. | The saved content with its digest. | A reference prefix says what kind of thing it names, not that it exists or may be read. |
capabilities (what the platform can compute here)
| Operation | The assistant gives it | It returns | Limits |
|---|---|---|---|
capabilities.summary (the computational contracts available) | cursor. | Capabilities with target kind, fidelity, seed use, metrics and required data; deployment availability. | Data readiness is not established by this list. |
capabilities.contract (one capability contract in detail) | capability_id; the contract to read; optional contract_digest, path, cursor. | The selected section of that contract. | An available runner does not mean the data for a run exists. |
session (pick up where things stopped)
| Operation | The assistant gives it | It returns | Limits |
|---|---|---|---|
session.resume (one named run) | run_ref. | State, worlds, receipt, limitations, the browser address and the next possible operations. | Durable context, not a hidden server session. |
session.simulation (where one simulation stands) | simulation_ref. | The question, its stage, references, and any action waiting for the person. | Only the person's own simulations. |
session.worlds (the worlds the person built) | cursor. | Worlds, newest first, with name and creation time. | Only the person's own worlds. |
session.world (one built world) | world_ref. | Setup, data sources, newest linked runs and run counts. | Only the person's own worlds. |
Control surface (actions the assistant takes for the person)
control_read and control_destructive have no operations.
| Operation | Tool | The assistant gives it | It returns | Approval |
|---|---|---|---|---|
control_resolve.operations (find control operations) | control_resolve | Optional query and domain; limit; cursor. | Matching control operations. | No approval needed |
control_resolve.operation_help (the exact contract of one control operation) | control_resolve | operation_id; optional known_digest. | The exact contract and an example. | No approval needed |
control_resolve.schema_section (one section of a large control schema) | control_resolve | operation_id; schema_kind; path; contract_digest; cursor. | The requested section. | No approval needed |
simulations.create (start a simulation from a question) | control_write | title; question; idempotency_key. | simulation_ref, revision, lifecycle and generation references. | No approval needed |
simulations.lifecycle (move a simulation to the trash, or restore it) | control_write | simulation_ref; lifecycle (active or trash). | The new lifecycle state. | No approval needed |
worlds.create (build a world from explicit data) | control_write | simulation_ref; world (name, network, bounds, agent capacity, seed); idempotency_key. | world_ref, data sources and the source used. | No approval needed |
worlds.create_from_place (build a world for a named place) | control_write | simulation_ref; place; road defaults (US or GB); agent capacity; green time fraction; minimum edge length; consolidation tolerance; full detail; seed; idempotency_key. | world_ref and the data sources used. | No approval needed |
sources.bind (link one saved version of the person's data file) | control_write | The dataset version the person allows simulations to read; column, unit, place, time, population and missing-value declarations. | A source reference with every value and its limits. | No approval needed |
scenarios.create_lineage (begin a proposal) | control_propose | simulation_ref; idempotency_key. | lineage_id and the current edit head. | No approval needed |
scenarios.propose (write a scenario proposal) | control_propose | lineage_ref; proposal (prompt, material, prior edit head, versions, data references, limits). | Proposal version, content digest, state and the review address. | Your approval in the browser |
scenarios.propose_variant (propose a variant of a scenario) | control_propose | Immutable parent; typed changes; attribution; rights to reuse its data. | A variant proposal and its review address. | Your approval in the browser |
runs.propose_continuation (propose continuing a run) | control_propose | A finished run and its end state or a saved checkpoint; how the seed continues. | A continuation proposal showing the carried-over state, and its review address. | Your approval in the browser |
sweeps.propose (propose a sweep) | control_propose | A scenario; every variant's explicit values, within the platform's run limit. | A sweep proposal listing every variant and the total number of runs, and its review address. | Your approval in the browser |
searches.propose (propose the runs a search needs) | control_propose | Candidate domain; objective; budget; seeds. | A bounded search proposal and its review address. | Your approval in the browser |
watches.propose (propose a watch) | control_propose | Metric; operator and threshold; region; cooldown; notification destination; optional Frame. | A watch proposal and its review address. | Your approval in the browser |
scenarios.generate (generate an approved proposal) | control_write | The approved proposal version; idempotency_key. | The generated scenario, variant, continuation or sweep, ready to run. | Needs an approved proposal |
watches.cancel (cancel a watch) | control_write | The watch reference. | The cancelled watch; delivery stops. | No approval needed |
Only the person, in the browser
- Approving a scenario, variant, continuation, sweep or search proposal version.
- Activating a proposed watch.
- Applying an ADAPT proposal.
Shared rules and limits
| Rule | Detail |
|---|---|
| Transport | HTTP POST to /mcp (both endpoints), /mcp/agent or /mcp/control, stateless with JSON responses; or stdio with bounded UTF-8 JSON lines. |
| Identity | An API key resolves to the tenant, the person and their current scopes (read, write, simulate). Identity can never be supplied in tool arguments. |
| Effects | resolve (look up), read (read state), propose (record material for the person's approval), write (save a result, world, generation or run), destructive (no operations). |
| Retries | Operations that save something take an idempotency_key; an identical retry returns the original result. |
| Paging | Opaque signed cursors bound to the person, the query and the catalog state. |
| Refusals | A code, an explanation, a safe diagnostic and up to three suggestions; use_instead names the tool that can take the request, and following it is a new call with its own permission. |
| Evidence | Every saved result carries its inputs, method, source fields, content digests and claim strength (OBS observe, INT interpret, RSN reason, ACT act, LRN learn; CS0 to CS4). Claim strength is ordinal, not a probability. |
| Size limits | One tool definition 8,192 bytes; agent catalog 40,000; control catalog 12,000; combined catalog 24,000; service instructions 2,048; one response 16,384; one request 1,048,576. |