Known limits

Datagoat isn't the right tool for every question. These are the edges we know about, so you can design around them.

What it can't answer

  • Anything without history. Datagoat learns from outcomes you've recorded. A record needs about 500 labeled rows. Below that, the answer is not_yet. For a new question with no history, use a zero-shot model like Jev.
  • Free text. Text columns count as categories, not as language. To use what a message says, turn it into columns first (Read, then learn).
  • Numbers. Outcomes are yes/no. "How much will they spend?" needs a regression tool. "Will they spend over $500?" works, if the record has that column.
  • Causes. Reasons and choice picks are associations in the record. Switching a customer to the picked contract may not keep them. Report what happens, and let the outcomes tell you.

How it answers

  • A refusal stays a refusal. The same record and the same question always refuse the same way. Retrying is pointless. Change the record (more rows, more columns) or the question.
  • The first fit takes time. Seconds on a small table. A minute or two on a large record, and then the call returns pending. A repeat call on the same bytes answers from the cached fit.
  • One changed byte is a new record. Appending a day of rows makes a new fit. Use refit_of to link the two, and dg_drift to see whether anything moved.
  • outcome_is_desirable is part of the fit. Two questions on one outcome share a fit only when they say the same thing about it. One with false and one with nothing set run two fits.
  • rank beside other types ranks only the cases. The other types need cases, and rank ranks what it's given. Rank the whole record in its own call.
  • Choice needs the option to matter. When the option column isn't part of the pattern, the answer is refused (option_not_in_pattern), not a tie-break.

Proving that acting worked

  • Levers appear only where the engine can show the changed state is reachable on held-out rows. Many answers carry none, and then there is nothing to attest.
  • dg_evidence compares groups only once each has 30 cases with a reported outcome.
  • Acted cases are chosen by you, not at random. A difference is evidence, not proof of cause.
  • Models fitted before lever tokens were added carry levers without tokens until they refit.

Size

  • Up to 8 questions and 10,000 cases per call. Inline records up to 10,000 rows (or 8 MB of CSV). Larger records go through dg_add_dataset.
  • rank returns at most 1,000 cases.
  • Over MCP, a large answer can overflow an assistant's context. Ask about the cases the conversation needs, and use the REST API for bulk scoring.

Shapes

  • Shapes other than table answer about cases by id, not new rows.
  • The reading's windows and horizons come from fixed sets (for example, horizon_days of 30, 60 or 90). Other values are refused, with the allowed ones listed.
  • An event log shorter than its windows reads to nothing (shape_empty).

Verdicts

  • A Verdict expires with its model, 90 days after the fit, even when a later call reused that fit. After that, the question fits again.
  • Verdicts name datagoat.io as their issuer and verify against Datagoat's public keys.