Create an agent Team abstraction and example
A Team is a recursive abstraction for containing one or more agents together. The agents inside teams need not be tied one-to-one to actual characters in the game. It could be that a team has agents which cooperatively yield to one another for control over a single game character, for example the BacktrackingSystem can be a two-agent Team in charge of a single character. Since teams are recursive, you could have a Team of two BacktrackingSystem teams working together, each controlling one character each.
Tasks can be given to individual agents but also to teams. Agents can be optionally made aware of tasks given to teams higher up than them in the team hierarchy. If agents are not given individual tasks then they can simply inherit the task given to the team that they're in. This will make task_config objects more organized since it will specify things at a team level, and a run config can have any number of agents organized in any way to be a single team. This will then also require separating out team specifications into separate team config files which can be referenced in the run configs.
Could we use forces to manage teams? I would prefer avoiding developing our own abstractions if there exists similar abstractions in the game.
On the factorio API side yes we would definitely use forces. But on the python/agent side I would like to make a Team abstraction specifically to be recursive. Teams can be nested (like human organizations) but the LuaForce class in factorio doesn't support that. An agent can be placed inside of anywhere in a nested Team instance but ultimately will only be identified with a single factorio force.