No contract, graph, primitive ID or capability request in Allternit names a model or a vendor. This is design law 6: contracts, never model names.
Architecture contract
What a graph may name:- primitive IDs (
obs.list_files) - capability IDs (
cap.decision.rank,cap.generate.code_patch) - classes, locality, trust and quality floors
- Interchangeability. The architecture’s test is that swapping one model for another must not change the agent loop, state model, tool authority, completion semantics or workflow graph. A graph that names a model fails that test by construction.
- Routing. The router can only pick the cheapest correct component per step if the graph leaves the choice open.
- Evaluation. Comparing components on the same graph is only fair if the graph is the same.
- Durability. Models are retired and renamed. Capability IDs are stable.
- One external identity. Callers talk to one agent. Which components ran inside it is evidence, not identity.
Current implementation
- The 191 primitive IDs in the frozen registry contain no vendor or model names.
- The graph validator on main rejects a node, or a capability request, that pins a model or provider (invariant 7). It is merged as library code and not yet run on every accepted graph.
- Model choice today lives in runtime configuration, outside graphs.