You Were Never Declaring State. You Were Observing By Hand. | WebframpEvery Terraform file you ever wrote was a note to a blind tool. You looked at<br>your infrastructure, decided what it should be, wrote that decision into HCL, and<br>handed it to a program that could not see for itself. The declaration was your<br>observation, pre-computed and frozen into a file.<br>The same was true for Chef recipes, Puppet manifests, and CFEngine promises. You<br>observed the system. You wrote down what you saw and what you wanted. You gave<br>that note to an agent that could parse files but could not look around.<br>That was never “declaring state.” That was observing by hand and writing your<br>observations into a format a blind agent could consume.<br>What the declaration actually was#<br>Mark Burgess described promise theory in<br>In Search of Certainty as a model<br>of autonomous agents reasoning about their environment and making local promises<br>about their own behavior. The agent observes. The agent decides. The agent acts.<br>The tools we built to approximate this vision could not do the first step. A<br>CFEngine agent could parse a promise body and converge toward it, but it could<br>not observe the broader system and form a judgment about what promises to make.<br>A Chef agent could execute resources in order and check whether each one needed<br>convergence, but it could not look across the node’s full state and decide<br>whether the recipe was even relevant.<br>So we wrote the observation for them. We called it “desired state” and stored it<br>in files. The file was scaffolding for an agent that lacked the capacity to<br>observe.<br>What changed#<br>Agents can observe now.<br>A swamp model method runs against a live system, captures what it finds, and<br>stores the result as typed, versioned, schema-validated data. No human<br>pre-computed the observation into a file.<br>The @webframp/aws/adopt<br>extension exists solely to do this: observe existing AWS resources and bring them<br>under management as typed data. It does not declare what the resources should be.<br>It captures what they are. Each execution produces a versioned snapshot of<br>reality.<br>swamp model method run my-account discover_all --json
After this runs, the agent knows what exists: VPCs, subnets, gateways, route<br>tables, security groups, RDS clusters, secrets. It can query that knowledge:<br>swamp data query 'modelName == "my-account" && isLatest == true' --json
The data evolves with the live system. Run the method again next week and you get<br>a new version. Compare versions and you see drift. No declaration file needed<br>because the agent observed reality directly.<br>Where the boundary moved#<br>For a decade, the architect’s job included crafting declarations. You decided how<br>to represent your infrastructure in HCL or Ruby or YAML. The shape of the<br>declaration was a design decision. You spent judgment on it.<br>That boundary moved.<br>The architect’s job is now deciding where observation ends and action begins.<br>Which data is sufficient context for a decision? What workflow conditions justify<br>a write operation? What model boundary separates awareness from control?<br>These are boundary decisions, the places where you choose what one system knows<br>about another. You still spend judgment. You still define shape. But<br>now you think about the data you want to store more than the syntax of the<br>declaration you used to write. What schema does the observation produce? What<br>fields become queryable? What versioning granularity makes drift visible? The<br>design work moved from HCL blocks to data shape.<br>The honest limits#<br>This does not eliminate declarations. Three cases still require stated intent:<br>Provisioning. You cannot observe a resource that does not exist yet. Creating<br>something new requires you to specify what you want before reality contains it.<br>This is a small fraction of infrastructure operations work. Most of the work is<br>managing what already exists.<br>Compliance baselines. “All S3 buckets must have encryption enabled” is a<br>statement of intent, not an observation of reality. A compliance baseline is a<br>declaration by definition. But it lives in a Zod schema or a workflow condition,<br>not in a per-resource YAML block.<br>Rollback targets. “Roll back to the state from Tuesday” requires knowing what<br>Tuesday’s state was. Versioned data provides this (retrieve version N), but<br>someone must decide which version is the rollback target. That decision is<br>intent.<br>In all three cases, the intent lives in method logic, workflow conditions, and<br>schema definitions. Not in static files that drift from reality between applies.<br>The declaration moved from a file the tool reads to a constraint the agent<br>reasons about. Still declarations. Different medium.<br>Idempotency moves up the stack#<br>The old tools required every resource to be individually idempotent. A Chef<br>resource had to check whether the file existed before writing it. A Terraform<br>resource had to detect whether the security group already had the rule....