{"results":[{"id":"add-host-creates-attribute-accessible-hosts","text":"After `ftl.add_host(hostname=\"web01\", ...)`, the host is immediately addressable as `ftl.web01` for attribute-style host-scoped module calls (e.g., `ftl.web01.apt(...)`).","truth_value":"IN","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null},{"id":"ai-loop-host-accessor-syntax","text":"AI-loop action functions use the `ftl[\"hostname\"].module()` accessor pattern with `await` for sequential module calls (e.g., `await ftl[\"stargate\"].user(name=\"admin\")`).","truth_value":"IN","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null},{"id":"ai-loop-modules-are-idempotent","text":"Module calls in AI-loop actions (user, file, copy, lineinfile, service) are idempotent — safe to re-run even if the condition gate fails to prevent unnecessary executions.","truth_value":"IN","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null},{"id":"ai-loop-observe-list-structure","text":"AI-loop observe blocks are lists of dicts with `name`, `module`, `params`, and `host` keys that run commands on target hosts to gather state.","truth_value":"IN","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null},{"id":"ai-loop-typed-function-contract","text":"AI-loop rules define a typed function contract across their three phases: observe is a declarative list of module dicts with name/module/params/host keys, condition receives a structured state dict keyed by observation name, and action receives the full FTL2 runtime with host accessors and module methods.","truth_value":"IN","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null},{"id":"ansible-ecosystem-fully-compatible","text":"All Ansible collection modules work seamlessly in FTL2 via FQCN dot-notation addressing and community accessors.","truth_value":"OUT","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null},{"id":"ansible-familiarity-across-layers","text":"FTL2 preserves Ansible familiarity at every interaction layer: CLI flags mirror `-m -i -a`, variable precedence follows group < host < argument ordering, inventory groups map directly to Ansible groups, and modules support both short names and FQCNs.","truth_value":"IN","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null},{"id":"ansible-gradual-migration-path","text":"FTL2 enables gradual Ansible migration without workflow disruption: familiar CLI/inventory/FQCN patterns reduce learning curve while the universal module system (four addressing syntaxes, dual native/bundled execution modes) lets teams run existing Ansible collections alongside faster FTL2 natives incrementally.","truth_value":"IN","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null},{"id":"ansible-migration-with-full-speedup","text":"Teams migrating from Ansible gain FTL2's full compound speed advantage (3-21x: in-process execution, gate caching, default parallelism) while retaining access to their existing module ecosystem through FQCN dot-notation and Ansible-compatible bundled execution — migration preserves investment in existing modules without sacrificing performance.","truth_value":"OUT","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null},{"id":"ansible-migration-zero-friction","text":"Teams migrating from Ansible experience zero-friction adoption: familiar CLI flags, variable precedence, inventory groups, and FQCN naming transfer directly while the dual-mode execution architecture runs existing Ansible modules without modification.","truth_value":"OUT","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null},{"id":"authorized-key-module-fqcn","text":"SSH public keys are deployed via `ftl.host.ansible.posix.authorized_key()` using the full FQCN pattern, supporting user/key/state parameters.","truth_value":"IN","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null},{"id":"automation-complete-developer-experience","text":"The AutomationContext serves as a unified entry point (async context manager) that combines module access through four addressing syntaxes (dot, bracket, FQCN, proxy) with configurable error semantics (continue-on-error or fail-fast with introspectable exceptions), providing a cohesive developer interface for FTL2 automation.","truth_value":"IN","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null},{"id":"automation-context-manager-entry-point","text":"`async with automation() as ftl:` is the entry point for all FTL2 automation scripts, providing module access, inventory, secrets, and result tracking.","truth_value":"IN","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null},{"id":"automation-context-unified-api","text":"AutomationContext is the primary user-facing class for FTL2 automation, providing an async context manager entry point, module access via attributes, secret binding and access, categorized result tracking (changed/ok/failed), and dual error handling modes (continue-on-error or fail-fast).","truth_value":"IN","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null},{"id":"automation-error-has-result-attribute","text":"`AutomationError` has `message` (str) and `result` (the failed `ExecuteResult`) attributes, enabling granular error inspection per host and module.","truth_value":"IN","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null},{"id":"automation-fail-fast-raises-automationerror","text":"`automation(fail_fast=True)` raises `AutomationError` on first module failure; the exception has `.result.module` to identify the failing module.","truth_value":"IN","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null},{"id":"automation-fqcn-via-namespace-proxy-chaining","text":"FQCN modules use `NamespaceProxy` chaining: `ftl.amazon.aws.ec2_instance(...)` chains `NamespaceProxy(\"amazon\")` → `.aws` → `NamespaceProxy(\"amazon.aws\")` → `.ec2_instance()` executes `\"amazon.aws.ec2_instance\"`.","truth_value":"IN","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null},{"id":"automation-module-restriction-raises-attributeerror","text":"`automation(modules=[\"file\", \"copy\"])` restricts which modules can be called; accessing a disallowed module raises `AttributeError`, not a runtime module error.","truth_value":"IN","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null},{"id":"automation-modules-as-attributes","text":"Modules are called as attributes on the automation context: `await ftl.module_name(param=value)` — no string lookups or dictionaries needed.","truth_value":"IN","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null},{"id":"automation-modules-parameter-restricts-available","text":"`automation(modules=[\"file\", \"copy\"])` restricts which modules are available; calling an unlisted module raises `AttributeError`.","truth_value":"IN","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null}],"count":189,"limit":20,"offset":0}