Overview

Date: 2026-05-11

Time: 15:10

Overview

This page traces FTL2's development chronologically from February 5-11, covering the evolution from core architecture through modules, event streaming, the automation context API, gate-based remote execution, native modules, state management, dependency tracking, audit/replay, the policy engine, inventory formats, and Vault integration. It reveals the design motivations and performance rationale behind each subsystem.

Key Concepts

Commands and Syntax

Automation context:


async with automation(inventory="hosts.yml", secret_bindings={...}) as ftl:
    await ftl.file(path="/tmp/test", state="directory")
    await ftl.run_on("webservers", "dnf", name="nginx", state="present")

Host-scoped access: ftl["hostname"].module() — bracket notation supports host names with dashes

Dynamic hosts: add_host() persists to state immediately

Event listening: await ftl.listen() for persistent monitoring (inotify, metrics)

Audit/replay:

Vault secrets: vaultsecrets parameter maps names to path#field; uses VAULTADDR/VAULT_TOKEN env vars; accessed via ftl.secrets["NAME"]

Dependency files: .ftl2-deps.txt (Python requirements), .ftl2-modules.txt (module names for gate building)

Gate cache location: ~/.ftl per user

Relationships

Exam-Relevant Points