Engine-agnostic, deterministic Goal-Oriented Action Planning (GOAP) framework for tactical AI agents. Written in C# targeting .NET 10, with bounded capacities, Power-of-Ten style constraints, and host-facing contracts that do not depend on any game engine.
| Form | Meaning |
|---|---|
| DynamicPlanningAI | Full product / solution / assembly / namespace name |
| DP_AI | Accepted short form of DynamicPlanningAI |
| DP | Always means DynamicPlanning (never a standalone product name) |
Task identifiers use the DP- prefix (for example DP-PLN-001) because DP
means DynamicPlanning. See docs/NAMING.md.
DynamicPlanningAI is inspired by publicly documented F.E.A.R.-era GOAP / tactical AI principles. It is original engineering, not a reverse-engineered or proprietary reproduction of any commercial AI codebase. See NOTICE.md and docs/PUBLIC_SOURCE_FIDELITY.md.
- Backward regression A* planner over a bit-mask symbolic world state
- Incremental planning with per-step expansion budgets and explicit
PlannerStatusoutcomes - Goal arbitration selecting among competing agent goals each tick
- Action execution lifecycle with volatile precondition checks and typed failure reasons
- Perception and working memory feeding quantized world facts
- Target / weapon selection, tactical points, and cover reservation
- Navigation host contracts (engine-agnostic path queries)
- Squad coordination and semantic communication intents
- Deterministic ticks via host-provided
AiTick(no wall-clock reads) - Frozen runtime path with allocation discipline and audit tooling
- Console sample scenarios (e.g.
BasicAttack) for regression demos
| Project | Role |
|---|---|
DynamicPlanningAI.Abstractions |
Contracts, identifiers, limits, domain enums |
DynamicPlanningAI.Runtime |
Planner, memory, cover, squad, execution |
DynamicPlanningAI.Configuration |
Validated immutable config loading |
DynamicPlanningAI.Diagnostics |
Tracing, formatters, contract helpers |
DynamicPlanningAI.Sample |
Deterministic console simulation |
DynamicPlanningAI.Audit |
Power-of-Ten / allocation-path source audit |
tests/* |
Unit, integration, simulation, architecture tests |
Dependency direction:
Abstractions ← Runtime ← Configuration ← Sample
Abstractions ← Diagnostics (also referenced by Sample)
export PATH="$HOME/.dotnet:$PATH"
dotnet restore
dotnet build --configuration Release
dotnet test --configuration Release --no-build
dotnet format --verify-no-changes
dotnet run --project tools/DynamicPlanningAI.Audit --configuration Release
dotnet run --project src/DynamicPlanningAI.Sample --configuration Release -- --scenario BasicAttackRequires the .NET SDK version pinned in global.json (10.0.x).
flowchart TB
Host[Host / Engine Adapter]
Sample[DynamicPlanningAI.Sample]
Config[DynamicPlanningAI.Configuration]
Runtime[DynamicPlanningAI.Runtime]
Diag[DynamicPlanningAI.Diagnostics]
Abs[DynamicPlanningAI.Abstractions]
Host --> Runtime
Sample --> Config
Sample --> Runtime
Sample --> Diag
Config --> Runtime
Runtime --> Abs
Diag --> Abs
Config --> Abs
subgraph RuntimeTick[Per-tick pipeline]
Perc[Perception]
Mem[Working Memory]
Goal[Goal Arbitration]
Plan[GOAP Planner]
Exec[Action Execution]
Squad[Squad Coordinator]
Comm[Communication]
Perc --> Mem --> Goal --> Plan --> Exec
Squad --> Goal
Comm --> Mem
end
Runtime --- RuntimeTick
See docs/ARCHITECTURE.md for subsystem boundaries and lifecycle states.
Absolute ceilings live in AiHardLimits (Abstractions). Examples:
| Limit | Value |
|---|---|
| Agents | 64 |
| Squads | 16 |
| Goals per agent | 32 |
| Plan length | 16 |
| Planner nodes | 512 |
| World facts | 64 |
| Tactical points | 256 |
Runtime configuration may only select values at or below these ceilings.
- Runtime, configuration loaders, sample scenarios, and audit rules are under active implementation; Abstractions contracts and limits are the stable foundation today. Track status in docs/REQUIREMENTS_TRACEABILITY.md.
- Planning is symbolic only; continuous combat math belongs in the host or in pre-planning quantizers.
- Navigation mesh queries are host-provided; the library does not embed a pathfinder.
- Not a full animation, physics, or networking stack.
- Single-threaded tick assumption: the host must serialize
AiRuntimeticks.
MIT — see LICENSE.md. Third-party and inspiration notices: NOTICE.md.