Skip to content

chore: release main - #269

Open
se-jo-ma wants to merge 1 commit into
mainfrom
release-please--branches--main
Open

se-jo-ma wants to merge 1 commit into
mainfrom
release-please--branches--main

Conversation

@se-jo-ma

Copy link
Copy Markdown
Member

🤖 I have created a release beep boop

0.14.0

0.14.0 (2026-10-21)

⚠ BREAKING CHANGES

  • rest: a REST request body with a key the model does not declare is refused with 422 instead of ignored. Remove the extra key, or fix its spelling.
  • classification: an unknown level on either side of below, meets_or_exceeds, within_scope, -below, -meets-or-exceeds, -within-scope or fathom-dominates now fails the evaluation with EvaluationError instead of evaluating false, and fathom.engine.dominates raises EvaluationError instead of returning False. Make sure every classified slot holds a declared level (allowed_values on the template slot rejects a bad label at assert time), and handle EvaluationError where you call evaluate().
  • facts: a bool sent for a string slot raises ValidationError (400 on REST, INVALID_ARGUMENT on gRPC) instead of being stored as "True"/"False". Send the string you mean, e.g. "TRUE" for the hipaa pack's data_transfer.encrypted.
  • compiler: contains($alias.field) now matches the referenced fact's value instead of the literal text; to search for that text, use matches($s.name). matches($alias.field) no longer loads; write the pattern as a literal.
  • chained_log: a chained log line that is not the writer's canonical encoding, or that holds NaN/Infinity (which earlier versions could write), now fails verify_chain. Records passed to append must be finite JSON.
  • attestation: verify_token accepts only evaluation attestations by default. Verify hot-reload and other sign_event tokens with verify_token(token, key, typ="fathom.event"); tokens issued before this change carry no typ claim, so verify those with typ=None. sign_event no longer lets the payload override iss or iat. AttestationService raises AttestationError for a public key that does not match the private key.
  • models: then.scope is no longer accepted in a rule and ThenBlock(scope=...) raises. It never had an effect; delete it. To narrow a decision, use action: scope and carry the detail in then.metadata.
  • fleet: FleetEngine.create_session raises FleetError when the id already has a session; call replace_session(session_id) to rebuild it. FleetEngine.sync_fleet_facts takes the session id instead of the Engine: call sync_fleet_facts(session_id).
  • compiler: a rule that passes more arguments than a temporal operator takes, a non-numeric threshold or window, or a then.assert or temporal argument naming an unregistered template or slot now fails to load with CompilationError. Remove the surplus argument or fix the name.
  • mcp: the MCP input-schema titles change from tool_Arguments to fathom_Arguments. A client matching on the title should match on the tool name instead.
  • cli: fathom convert to-rego exits 1, not 3, when the ruleset does not compile; scripts that treated 3 as a compile failure should test for 1 (3 still means a refused deny). fathom mcp exits 3, not 1, when the mcp extra is missing, and the fathom script exits 3, not 1, without the cli extra. info, bench, repl and mcp exit 2 on a directory with no YAML files instead of running an empty engine, and every pack-loading command exits 2 on a file argument instead of 1: pass the pack directory.
  • grpc: gRPC filter_json "null" no longer means "match every fact"; it is INVALID_ARGUMENT. Send an empty filter_json to match every fact of the template.
  • classification: below, meets_or_exceeds, -below, -meets-or-exceeds and fathom-dominates are now false when either level is outside the hierarchy. A deny written with below no longer fires on an unknown label; rely on default deny or allowed_values. A $alias.field classification operator in a bundle with more than one hierarchy no longer loads; compare with a literal level or call -meets-or-exceeds from a test: condition.
  • engine: Engine(...) raises ValueError for a negative run_limit (use None for no budget) and for a default_decision that is not None or a rule action (use one of allow, deny, escalate, scope, route). Engine.load_rules on a missing path raises CompilationError instead of FileNotFoundError.
  • rest: build_app() no longer returns fathom.integrations.rest.app. Serve the object build_app() returns; configuring it does not change what uvicorn fathom.integrations.rest:app serves. The private module attribute session_store is gone; use app.state.session_store.
  • rego: fathom.rego.convert_file is removed; call convert_source(text, filename=..., template=...) instead. flatten_input no longer accepts a second argument, and OPA_DOWNLOAD_URL is no longer in fathom.rego.all.
  • fleet: FleetEngine.query raises ValidationError when the filter names an unknown template or slot, instead of returning matches.
  • packs: asserting a value outside the listed vocabulary into one of these slots now raises ValidationError. Send the lower-case listed value (for example ftp, secret, admin, read); map other protocols to plaintext or a listed secure one, and other event types to a listed one.
  • yaml: a YAML file or payload with a repeated mapping key no longer loads. Remove the duplicate.
  • compiler: a template, module, function or rule file with a top-level key outside its allowed set no longer loads. Remove or correct the key; the allowed keys are listed in the YAML reference.
  • engine: a ruleset with a pattern on a template that is not registered no longer loads, even when the pattern has no slot conditions. Fix the template name, or load the templates first.
  • packs: the hipaa data_transfer.encrypted slot is a string, not a symbol, and any value other than true (any case) now denies a PHI transfer. Send True or "true" for an encrypted transfer. Blank or whitespace-only justification, context, subject and resource values now trigger the hipaa, nist-800-53 and cmmc rules that require them.
  • engine: Engine.template_registry, module_registry and rule_registry are now read-only Mappings. Code that mutated them must load or reload rules instead; code that needs a dict should call dict(engine.rule_registry).
  • rego: fathom convert rego and fathom convert to-rego exit 3 and write nothing when a deny rule cannot be translated, where they used to exit 0 with that rule left out; convert_ast and export_engine raise CompilationError in the same case. Rewrite the deny into the supported subset or translate it by hand.
  • fleet: fleet store rows now hold the validated fact: defaulted slots are present and coerced values have the slot's type. Filter FleetEngine.query on the coerced value (e.g. "123" for a STRING slot), not on the type the caller passed.
  • facts: a null in a required slot is now rejected as a missing slot (REST 422 validation_error), and null, objects and arrays in any string slot are rejected as a type mismatch. Omit an optional slot instead of sending null, and send strings for string slots.
  • compiler: a ruleset whose rule asserts into a fleet-scoped template no longer loads. Assert a session-scoped fact from the rule and publish it with FleetEngine.assert_fact.
  • engine: Engine.assert_facts and Engine.step(facts=) raise ScopeError when a batch names a fleet-scoped template. Assert those facts through FleetEngine.assert_fact instead.
  • evaluator: an evaluation during which a rule errors now raises EvaluationError instead of returning a decision. A matches pattern that is not a valid Python regex no longer loads.
  • grpc: a gRPC AssertFact, Query, Retract or SubscribeChanges with an empty session_id is now refused with INVALID_ARGUMENT. Create a session with Evaluate and pass its id. A server that mounts an engine refuses sessions, so it no longer offers these four RPCs at all, the same as REST.

Features

  • cli: add fathom mcp to launch the MCP server over stdio (680d604)
  • engine: add Engine.hierarchy(name) for loaded classification hierarchies (f13661e)
  • rego: flatten_input takes declared= to keep only template slots (4c7b131)

Bug Fixes

  • attestation: tag token kinds, check them in verify_token, refuse bad keys (c5b577b)
  • chained_log: concurrent load_or_create_key hands out one key (4793319)
  • chained_log: refuse appends when the log shrank under the writer (a6e5344)
  • chained_log: report deeply nested lines and serialise close with append (dc52913)
  • chained_log: require canonical lines, refuse NaN, accept a PEM str (99a137a)
  • chained-log: re-read the head when a writer takes the lock (78015d5)
  • ci: green the #264 checks on Linux, Windows and the extras job (4750ccd)
  • classification: an unknown level fails closed in every comparison (95fea20)
  • classification: an unknown level stops the evaluation (eac898e)
  • cli: keep bracketed text in error, warning and success messages (7506944)
  • cli: one rule-pack loader and one exit code per condition (148e914)
  • cli: ship pyjwt with the cli extra so verify-chain runs (fc0d4b4)
  • compiler: a bind on a joined slot works with every cross-ref operator (2b58343)
  • compiler: check temporal arguments and then.assert targets at load (bc1d7ed)
  • compiler: contains joins on $alias.field and matches refuses it (d423502)
  • compiler: drop the dominates operator and document the compartment ones (48e2c0f)
  • compiler: judge temporal operators at run time, not at assert time (5be3084)
  • compiler: name the rejected field in a parse error's message (e944bd0)
  • compiler: refuse a rule assert into a fleet-scoped template (8498344)
  • compiler: reject unknown top-level keys in template, module, function and rule files (15247ce)
  • docker: serve rulesets from the image's /rules volume, fix the README sidecar (14e7ddf)
  • engine: keep CLIPS diagnostics off stderr (a3389e0)
  • engine: keep CLIPS runtime diagnostics, and the fact they quote, off stderr (77a8ed3)
  • engine: load hierarchies: from a function file, as the reference documents (56e66e9)
  • engine: raise CompilationError for an unknown module in a focus order (87fbc5f)
  • engine: refuse a negative run_limit and an unknown default_decision (d9e63f5)
  • engine: refuse fleet-scoped templates in assert_facts and step(facts=) (a2eaa97)
  • engine: registry views and hierarchy() return copies (03e3aaf)
  • engine: reject a rule pattern on an unregistered template before the build (e2e84af)
  • engine: return read-only views from the Engine registry properties (d5d4f66)
  • engine: undo the rules a failed load_rules call already built (8be613d)
  • evaluator: fail an evaluation closed when CLIPS reports a runtime error (e43f8f7)
  • facts: refuse a bool in a string slot (31ebb12)
  • facts: refuse NaN and infinity in numeric slots (5bb99c7)
  • facts: reject a null or non-scalar value in a string slot (762edfa)
  • fleet: announce only deleted Postgres rows and split connection errors (52d3425)
  • fleet: deliver every Redis change made after subscribe() returns (165d1a6)
  • fleet: isolate subscriber errors and deliver Postgres changes once (7452416)
  • fleet: make Redis writes atomic and keep a failing subscriber alive (d6d9f5b)
  • fleet: name Postgres channels for long templates by digest (5e0fa8e)
  • fleet: raise FleetError when PostgresFactStore is used before connect() (eb990f8)
  • fleet: refuse duplicate session ids and address sessions by id (217426c)
  • fleet: refuse unknown filter slots in FleetEngine.query (62048ff)
  • fleet: store CLIPS implicit slot defaults with fleet facts (70c54f8)
  • fleet: write the validated fact to the FactStore, not the caller's dict (69f44cb)
  • grpc: answer INVALID_ARGUMENT for a fact, filter or JSON the engine refuses (6f3dc69)
  • grpc: refuse non-object JSON, let Evaluate open any session, wire Reload through serve() (fb28e8e)
  • grpc: refuse working-memory RPCs that name no session (0a80c80)
  • mcp: an evaluation error no longer echoes the CLIPS diagnostic (8712726)
  • mcp: title tool schemas by tool name, return rule metadata, keep error reasons (64bef70)
  • models: drop the inert then.scope and make function params optional (30d5e92)
  • name the missing extra on import, and stop typing fathom.<typo> as Any (4729c08)
  • packaging: make fathom-rules[cli] start, and an unsigned reload work on core (0357ff0)
  • packs: a loose pack file that does not parse is a CompilationError (5572009)
  • packs: close the symbol vocabularies that pack deny rules match (e40e3b5)
  • packs: deny every value the pack templates accept, not a hand-picked few (77b8982)
  • packs: deny unless a value is explicitly safe, in any spelling (263c990)
  • rego: refuse a conversion or export that would drop a deny (b1751d7)
  • rego: refuse matches() patterns OPA's RE2 cannot evaluate (b25b303)
  • rego: rename convert_file to convert_source and tidy the rego surface (4c9a9d2)
  • release_sig: check the trusted comment and report non-UTF-8 files as malformed (67146cd)
  • rest,grpc: cap session ids at 128 characters and document session limits (b54dd90)
  • rest: /v1/compile classifies a document exactly like fathom compile (549e01a)
  • rest: audit every reload refusal, path-jail, oversize and bad body included (d93de08)
  • rest: build_app returns a new app with its own state per call (8c6826b)
  • rest: declare bearer auth as an OpenAPI security scheme (46364f0)
  • rest: declare every status reload and the session GET routes return (f9d0e80)
  • rest: declare every status the routes return, with the body they send (ecc9e61)
  • rest: do not echo CLIPS diagnostics in evaluation 500s (9d71ccd)
  • rest: refuse unknown keys in REST request bodies (0a5e0b0)
  • surface: export the types covered Engine methods return and raise (5a92e6e)
  • validate: refuse a focus_order file with no modules key (751c0eb)
  • yaml: reject duplicate mapping keys in every YAML loader (9f88c0d)

Performance Improvements

  • engine: renew the epoch fact only when a temporal rule is loaded (ff34a75)

Documentation

  • changelog for the fleet query filter check and file-kind agreement (5c79639)
  • changelog for the fleet subscribe, retract and error-split fixes (bf94c25)
  • changelog for the round-2 audit fixes (cbffb2a)
  • cli: document the CLI exit codes, including 3 (e004aa1)
  • contributing: changelog is promoted, and the 1.0 checklist names every pre-1.0 line (68af9ee)
  • correct pack overlap, overlay precedence and adapter raise behaviour (ce975a9)
  • correct the configuration env table and REST auth exemptions (053b4bd)
  • embed-sdk: the Python example asserts facts example 01 defines, and runs in tests (3c67953)
  • fleet: document the Redis and Postgres fact stores (98dcfba)
  • fleet: state the uniform subscribe, retract and error contract (abe7a25)
  • hello-world: rule_trace comment shows the real output (cea74fc)
  • hot-reload: match the reload contract the server enforces (bc6c50a)
  • hot-reload: the missing-pubkey startup failure is build_app()'s, not the shipped app's (0c3c3a4)
  • readme: fix the MCP example's constructor and launch call (87faf44)
  • readme: name the real gRPC service in the sidecar example (98475ef)
  • readme: pack names are the entry-point names, and every CLI command is listed (26e2386)
  • record the 1.0 should-fix changes and re-verify the pages citing them (7b73dc9)
  • record the three 1.0 blocker fixes and re-verify the pages citing them (8ef0fff)
  • versioning: cover fathom.compiler.Compiler (8b3f92f)
  • versioning: cover rule packs, integrations, Rego and the fleet stores (fcff7c4)
  • versioning: cover the classification CLIPS built-ins Nautilus calls (379c6ef)
  • versioning: document how to cut 1.0.0 and what 1.x promises (fa582d4)
  • versioning: let a pack rule fix ship in a minor release (e8d8320)
  • yaml: match the template and rule references to the models (436744e)
fathom-ts: 0.14.0

0.14.0 (2026-10-21)

Features

  • 1.0-readiness findings, shipped as 0.10.0 (79faa66)
  • api: align the evaluate response across REST, gRPC, and the SDKs (5af7e15)

Bug Fixes

  • ci: hermetic typedoc invocation + always-run required checks (#26) (ed1cdd1)
  • deps: clear 45 of 46 Dependabot security advisories (59d0aaf)
  • ts-sdk: clear the TypeScript SDK's security advisories (ec9c3af)
  • ts-sdk: delete the stale root OpenAPI spec and its dead generated client (ee04603)

Performance Improvements

  • ts: strip trailing slashes without a backtracking regex (28c260f)

This PR was generated with Release Please. See documentation.

Signed-off-by: se-jo-ma <46336194+se-jo-ma@users.noreply.github.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants