Skip to main content
Authoring is invite-only private beta. Everything on this page needs an Aethis API key with authoring scopes, plus your own model-provider key for the generation steps. Request access, or start on the open evaluate tier with your first decision — no key required. The two tiers are set out on Capabilities and access.
Authoring is invite-only private beta — request access.

Why field vocabulary matters

Test cases are written against field names. If the names in your test cases don’t exactly match the names the engine expects, the tests will silently fail for the wrong reason — the engine receives an unknown field and treats it as absent. Phase 2 resolves this before test writing begins. You discover what fields the source text implies, validate them against your expected spec, and confirm names before writing a single test case.

Step 1 — Discover fields from source text

Returns:

If you know the fields you expect before discovery, set a spec upfront. aethis_discover_fields will auto-validate against it:
When a spec is set, aethis_discover_fields returns a validation result alongside the field list showing any missing fields, type mismatches, or unexpected extras.

Pin field notes exactly

Use notes on a field spec when the note content is authoritative. It is an ordered list of objects. Each has a required note_text string, an optional source string, and an optional metadata object. The metadata is opaque JSON: the engine preserves it without assigning meaning to its keys.
From the CLI, write the same shape in fields/fields.yaml:
Each call replaces the project’s entire field spec, so include every expected field, not only the one you are pinning. The property has three states:
  • Omit notes on a field to leave its notes to the model.
  • Send notes: [] to clear the field’s notes authoritatively.
  • Do not send notes: null. The API rejects it with a 422; use [] to clear.
Each note may use only note_text, source, and metadata. An unknown key, or an entry without note_text, is rejected with a 422. The CLI (v0.43.0+) applies the same checks to fields.yaml before it makes any engine call, and sends each entry exactly as written. During generation, the engine checks an authored list exactly, including list order and metadata (object key order does not matter), and checks it again before it saves the resulting ruleset. If the generated ruleset’s notes still differ, the generation fails with authored_notes_mismatch. When you refine a ruleset whose fields already carry the declared notes, the refinement can leave them unchanged. aethis_validate_fields is a separate check. It compares field keys, types, and enum values; it does not validate authored notes.

Step 3 — Explicit validation

Validate discovered fields against your spec as a gate before writing test cases:
Returns (all match):
Returns (mismatch):

Refine if fields are wrong

Feedback must reference the specific field and its source in the legislation. After refining, re-run aethis_discover_fields to confirm the change.

Field naming conventions

Consistent naming within a domain makes test cases readable and prevents silently mismatched fields. Every field in a domain should follow the same convention.

After field vocabulary

Once field names are validated, write your test cases using those exact field names, then move to Phase 3 — Rule generation.
Write at least 5–10 test cases before generating rules. Cover: boundary values (just below, at, and above every threshold), every Enum value, and any combination of fields that exercises a distinct code path. The quality and coverage of your test suite determines how quickly rule generation converges.