Agent-Owned Godot Projects — Design Question
Status: Open design question
Decision requested
Design the NodeTool game architecture for this product direction:
The agent owns and maintains a game. It manages the game source and generated assets, may write any Godot code the game needs, and works in a dedicated project folder. A shipped template may seed the game, but it must not remain the authority over the source after creation.
The review must decide what a game is in NodeTool, where its files live, how the agent and workflows update it, and how NodeTool runs untrusted agent-authored Godot code safely. The answer should replace or narrow the current model in which a workflow graph fills a fixed template and an export node produces the Godot project.
This document describes the current implementation, the requested product model, constraints, conflicts, and review questions. The reviewer should not need prior discussion to understand the decision.
Requested review output
Return a design with these sections:
- Recommended ownership model and why it is better than the alternatives.
- The smallest agent-facing interface that covers project creation, source editing, generated-asset installation, verification, playtesting, and build export.
- Persistent data shapes and ownership relationships among a NodeTool project, workspace, game, workflow, asset, and chat thread.
- Folder layout and path rules for local and virtual workspaces.
- End-to-end sequences for creating a game, editing code, regenerating one asset, verifying, and exporting a build.
- Security model for running agent-authored GDScript and importing a project.
- Local and cloud execution behavior.
- Migration from the current template/export-node design.
- Failure modes, recovery behavior, versioning, and concurrent-edit rules.
- Test seams, harness coverage, and staged implementation plan.
Name rejected alternatives and the facts that rule them out. Mark assumptions that require product confirmation.
Product intent
The game is a long-lived software project, not a one-time media export. The agent should be able to:
- create or open a Godot project
- inspect and edit any source file in that project
- add scripts, scenes, resources, tests, and configuration
- generate and revise images, sprite sheets, tilesets, sound effects, and music
- install generated assets at stable project-relative paths
- keep code changes when an asset is regenerated
- run checks and a playtest loop
- export a distributable build separately from the source tree
- resume the same game in later turns without rediscovering its location
A template is allowed as a starter. It may provide a working loop, placeholder assets, scenes, scripts, input mappings, and smoke tests. After the initial copy, the mutable project folder is authoritative. A template update or asset workflow rerun must not reset agent-authored source.
The phrase “separate folder” has four intended separations that the design must make explicit:
- shipped templates are read-only package files
- each mutable game has its own workspace-relative source directory
- generated source assets are installed inside that game without sharing paths with another game
- distributable builds and archives do not overwrite the source directory
Whether each game needs its own Workspace row, or only its own directory
inside a project workspace, is open.
Current architecture
NodeTool projects
A NodeTool project is a database row that groups related work. The row contains an id, user id, name, free-text kind, lifecycle timestamps, and an optional project-agent thread id. It does not contain a root directory or game-specific state.
The project schema is in:
packages/models/src/schema/projects.tspackages/protocol/src/api-schemas/projects.tspackages/models/src/project.ts
The project document union currently includes storyboards, scripts, timelines, sketches, applications, and JavaScript scripts. There is no game document type. Workspace files can appear as restorable project tabs when their workspace belongs to the project, but a folder is not itself a project document.
Deleting a project deletes rows with the same project_id, including assets,
workflows, threads, jobs, predictions, and workspaces. This ownership rule is
implemented in Project.deleteOwned in packages/models/src/project.ts.
Workspaces
A runtime Workspace is the file interface used by agents, nodes, and workflow
runs. Paths are relative to its root. The interface rejects traversal outside
that root and supports local folders and virtual object storage.
Relevant files:
packages/runtime/src/workspace.tspackages/runtime/src/storage-workspace.tspackages/models/src/workspace.tspackages/models/src/schema/workspaces.tspackages/websocket/src/lib/workflow-workspace.ts
A workspace database row has id, user_id, name, path, project_id, and
is_default. A workflow may hold a workspace_id. The runtime interface has
these important properties:
interface Workspace {
readonly localDir: string | null;
key(path: string): string;
read(path: string): Promise<Uint8Array | null>;
readText(path: string): Promise<string | null>;
write(
path: string,
data: Uint8Array | string,
contentType?: string
): Promise<void>;
exists(path: string): Promise<boolean>;
list(
path?: string,
opts?: { recursive?: boolean }
): Promise<WorkspaceEntry[]>;
delete(path: string): Promise<boolean>;
deleteAll(path: string): Promise<number>;
copy(from: string, to: string): Promise<void>;
move(from: string, to: string): Promise<void>;
materialize(path: string): Promise<string>;
absorb(localPath: string, path: string): Promise<void>;
scratchDir(): Promise<string>;
}
localDir is null for cloud-backed workspaces. Byte movement must use the
workspace interface. A host program either needs a local workspace or must
materialize input into scratch storage and absorb outputs explicitly.
A project-agent chat does not currently resolve its workspace from the
project id. Chat workspace resolution uses the conversation’s bound workflow
when one exists and otherwise uses the user’s default workspace. The durable
lookup is threadWorkspaceWorkflowId in
packages/websocket/src/session/chat-turn.ts. This means a project can own
workspace rows while its agent thread still writes to a different workspace
unless a workflow binding supplies the intended one.
Assets
Generated media is stored as a NodeTool asset. Assets have project_id,
workflow, node, and job provenance. Media tools may also write a workspace
copy when given an output path.
Relevant files:
packages/models/src/schema/assets.tspackages/runtime/src/context.tspackages/agents/src/tools/asset-persist.ts
ProcessingContext.createAsset stamps the current projectId, workflowId,
jobId, and node id. A Godot project cannot use an asset:// identifier as a
runtime file path. The bytes must be copied into the project directory and its
Godot resources must reference the copied path. The current Godot writer does
this during project export.
This creates two related records:
- the NodeTool asset, which carries provenance and can be reused
- the installed file inside the Godot project, which Godot reads
The new design must define which record owns the stable mapping and how a regeneration updates it.
Shipped Godot templates
Three hand-written Godot 4.3 projects are checked into:
packages/godot-templates/templates/platformer/
packages/godot-templates/templates/topdown/
packages/godot-templates/templates/shmup/
Each template contains:
manifest.json
project.godot
assets/
scenes/
scripts/
test/smoke.gd
The package loader is packages/godot-templates/src/index.ts. It resolves the
source or packaged template directory, lists templates, locates Godot, and runs
headless checks. Packaged backends stage the template directory as a runtime
asset.
Each template runs with checked-in placeholder assets before generation. Its
manifest.json declares:
- template id and Godot minor version
- image, sprite-sheet, tileset, sound-effect, and music slots
- exact cell sizes, frame counts, durations, loop flags, and generation prompts
- a short list of hook scripts or scenes intended for edits
The manifest schema is gameAssetManifest in
packages/protocol/src/game-assets.ts:
{
version: 1,
template: string,
godot: string,
slots: GameSlotSpec[],
hooks: string[]
}
Slot ids map to deterministic files. Dots become underscores:
| Slot kind | Installed path |
|---|---|
| sprite sheet | assets/sprites/<slot>.png and .tres |
| tileset | assets/tiles/<slot>.png and .tres |
| image | assets/images/<slot>.png |
| sound effect or music | assets/audio/<slot>.<extension> and import sidecar |
Asset checks and slot metadata
The generation pipeline validates one asset at a time through game checker nodes:
nodetool.game.SpriteSheetnodetool.game.Tilesetnodetool.game.SeamlessImagenodetool.game.SoundEffectnodetool.game.MusicLoop
A checker emits a stored image or audio reference. Its metadata contains a
SlotFill under metadata.nodetool_slot. The fill records the slot id and
layout facts such as cell size, animation frame ranges, duration, or loop flag.
The checker output carries both the accepted bytes and the metadata needed to
write Godot resources.
A bare SlotFill is insufficient because it does not locate the media bytes.
resolveFills in packages/game-nodes/src/fills.ts rejects a bare fill and
requires the checker’s media output or a full filled-slot record.
The pure writer in packages/godot/src/writer.ts accepts a template manifest
and filled manifest. It produces text resources and a list of asset copies. It
does not read pixels. checkGodotProject validates generated resource ids and
references.
Project layout join
joinGodotProject in packages/game-nodes/src/project.ts currently combines
four responsibilities:
- validate fills against the selected template manifest
- generate Godot resources and copy media bytes
- copy or preserve template source files
- check references and optionally invoke headless Godot
It has two layout modes:
createcopies the template and writes generated resourcesrefreshpreserves every existing template file, including scripts and scenes, while replacing generated resources and copied asset files
refresh is selected when project.godot already exists and overwrite is
false. It also rewrites references when generated audio uses a different file
extension from the placeholder.
This preservation rule protects edits, but it also leaves the template export operation as the mechanism that updates an agent-owned project.
Export Godot Project node
nodetool.game.ExportGodotProject is implemented in
packages/game-nodes/src/nodes/game.ts.
Inputs:
{
template?: string;
name?: string;
fills?: (ImageRef | AudioRef)[];
directory?: string;
verify?: boolean;
}
Outputs:
{
output: { directory: string; verified: boolean; archive: string };
directory: string;
files: string[];
verified: boolean;
verification: Record<string, unknown>;
errors: string[];
archive: string;
}
The node:
- requires a workspace and project name
- loads a shipped template
- accepts zero, some, or all template slots
- keeps template placeholders for omitted slots
- defaults the destination to
games/<slug> - never overwrites existing scripts and scenes during refresh
- writes
<directory>.zip - defaults verification to true
- reports
verified: trueonly when Godot ran and returned no errors and no dangling references
The node is the final node in the guided Game flow’s generated asset workflow. The graph is expected to remain rerunnable as an asset-generation recipe.
Agent Godot capabilities
The agent capability module is:
packages/agents/src/capabilities/godot.specs.tspackages/agents/src/capabilities/godot.ts
It exposes:
| Capability | Current behavior |
|---|---|
list_game_templates |
Lists shipped templates, slots, and hooks |
export_godot_project |
Requires every manifest slot, joins a template with checked assets, and writes a project |
verify_godot_project |
Checks references, imports the project, checks scripts, and runs test/smoke.gd |
The export capability defaults to godot/<name>, unlike the node’s
games/<slug>. It accepts overwrite. The default is false, so later exports
preserve existing scripts and scenes.
The generic file capabilities already let an agent read, create, and edit text files anywhere inside its resolved workspace:
read_filewrite_fileedit_filelist_directoryglobgrep
The current godot-game skill in .agents/skills/godot-game/SKILL.md tells the
agent to export first, then edit the manifest’s hook files. It permits a new
scene when a hook needs one, but the template and hook list still define the
expected customization surface. This conflicts with the requested ability to
write any Godot code and restructure the project.
Guided Game flow
The existing product design is
docs/creation-flows/game-prd.md. Its main decisions are:
- the game document is a workflow, not a new document type
settings.gamestores setup state on that workflow- a model writes the game design, then a pure graph builder creates one generation and checker chain per template slot
- every checker feeds one
ExportGodotProjectnode - the graph run writes
games/<slug>and a zip - the project agent takes over after the first build
- later graph runs regenerate assets while refresh mode preserves edited code
The graph is the stored generation recipe. The exported directory is the playable deliverable. No persistent game record links that directory, its installed files, its source assets, and its workflow except by conventions in workflow settings and paths.
Verification and Godot execution
verifyWithGodot runs three checks:
godot --headless --path <dir> --import --quitgodot --headless --path <dir> --check-only -s <script>for every.gdgodot --headless --path <dir> -s res://test/smoke.gd
Verification runs only when Workspace.localDir is available and a Godot
binary is found. A virtual workspace reports that verification was skipped.
runGodotHeadless in packages/godot-templates/src/index.ts calls
child_process.spawn directly with a timeout. It captures stdout and stderr,
but it does not isolate filesystem access, network access, subprocesses, or
other host capabilities available to GDScript. Headless Godot is not a code
sandbox.
The agent-facing verify_godot_project capability is currently categorized as
read, even though it executes project scripts. The export capability is
categorized as write, and the workflow node can verify as part of a graph
run. This classification was acceptable only under an assumption that shipped
scripts and narrow hook edits were trusted enough to run. It must be revisited
when the explicit product requirement is arbitrary agent-authored Godot code.
Current lifecycle
The guided path works as follows:
- A workflow stores the brief, template, style, models, and project name.
- The graph generates each manifest asset and validates it with a checker.
ExportGodotProjectcopies the template togames/<slug>and installs the checked assets.- The export optionally runs headless Godot and creates a zip.
- The project agent edits hook scripts and scenes in the exported directory.
- A later graph run regenerates assets and calls the export node again.
- Refresh mode preserves source files and replaces generated resources and media.
This creates two possible authorities:
- the workflow and template define the initial structure and asset slots
- the exported folder contains the current game code and may diverge from both
The current design avoids overwriting the folder but does not model that folder as the primary game resource.
Requested lifecycle
The requested model starts from an agent-owned project folder:
- Create a game identity and assign its source directory.
- Optionally seed that directory from a template exactly once.
- Let the agent inspect, add, move, or edit any Godot source file.
- Generate assets through direct media calls or reusable workflows.
- Install selected asset versions at stable paths in the game directory.
- Update Godot resources or scenes without resetting unrelated source.
- Check references, parse scripts, and run approved verification or playtests.
- Keep the same game identity, directory, and agent thread across later turns.
- Export distributable builds and archives outside the source directory.
Templates and workflows become optional inputs to the game. Neither is the game itself.
An illustrative layout is below. It is not a decision:
games/<game-id>/
project.godot
scenes/
scripts/
assets/
generated/
imported/
test/
.nodetool/
game.json
asset-map.json
builds/<game-id>/
<platform exports and source archives>
The reviewer should decide whether NodeTool metadata belongs in hidden files, database rows, workflow settings, asset metadata, or a combination. Godot must not depend on NodeTool-only metadata to run after download.
Facts that expose the design conflict
- F1 — The current document is a workflow. The Game flow decision says the workflow is the game document, while the requested model says the mutable Godot source directory is the game.
- F2 — Workspace selection is not project selection. A project-agent thread resolves a workflow workspace or the user default. It does not automatically resolve a workspace owned by the project.
- F3 — Export paths disagree. The graph node defaults to
games/<slug>and the agent capability defaults togodot/<name>. - F4 — Slot completeness disagrees. The graph node accepts partial fills and placeholders. The agent export capability requires every manifest slot.
- F5 — Code authority is implicit. Refresh preserves source files, but no game record declares that the folder is authoritative or records which template files have diverged.
- F6 — Asset identity is split. NodeTool owns the generated asset record, while Godot owns a copied file. The mapping exists only while export computes it from slot metadata and deterministic paths.
- F7 — The hook model is too narrow. The current skill directs edits toward manifest hooks. The requested agent can replace the scene tree, add systems, and write any code.
- F8 — Verification executes code. The capability is classified as a read and the export node verifies by default, but arbitrary GDScript executes with the Godot process’s host permissions.
- F9 — Cloud storage is not an executable folder. File editing works through
a virtual workspace, but Godot verification currently requires
localDir. - F10 — Source archives are coupled to asset refresh. The export node writes a zip every time it updates assets, although source archiving and generated asset installation are different operations.
Constraints and proposed invariants
The reviewer may challenge these, but must address each one.
- The mutable Godot source must never live under
packages/godot-templates/templates/. - Every agent file operation must remain confined to the resolved workspace.
- A game must have a stable id. Renaming a game must not silently move or fork its source.
- The source directory must remain stable across chat turns and workflow runs.
- Generated asset installation must be idempotent and must not rewrite unrelated source files.
- Regenerating one asset must preserve scripts, scenes, and all other installed assets.
- Godot paths must be normal
res://project paths. Downloaded projects must run without NodeTool. - NodeTool asset provenance must survive installation so the agent can identify and replace the source asset later.
- A skipped verification must never be reported as successful verification.
- Running agent-authored code must be a distinct, correctly classified action with an explicit trust and isolation model.
- Local and cloud workspaces must share file semantics. Execution may differ, but the difference must be represented in results rather than hidden.
- Deleting a NodeTool project must have defined behavior for the game source, installed asset copies, generated asset records, builds, and active jobs.
- Concurrent workflow and agent writes must not silently discard source edits.
- Existing template-generated games need a migration or compatibility path.
Candidate ownership models
The review should compare at least these options.
O1 — Folder convention only
A game is a directory such as games/<id>. The project agent stores the path
in memory or workflow settings and uses generic file tools. No new game record
or document type is added.
This has the smallest implementation but weak identity, discovery, migration, concurrency, asset mapping, and deletion semantics. A later conversation may not know which folder is authoritative.
O2 — Game document that points to a directory
Add a persistent game resource with an id, project_id, workspace_id, source
path, Godot version, optional template origin, optional generation workflow ids,
and asset mappings. The source remains normal workspace files. The document
provides identity, UI discovery, lifecycle, and agent operations.
The design must prevent the database document and source metadata from becoming two competing authorities.
O3 — NodeTool project kind with one assigned workspace root
Treat a NodeTool project whose kind is game as the game identity. Assign one
workspace or workspace subdirectory as its source root. The project agent owns
all source and generated assets there. No separate game row exists.
This keeps one product-level identity, but the current project model permits
many documents and workspaces and does not have a canonical root. The free-text
kind field is not currently an invariant.
O4 — Workflow remains the game record
Keep settings.game and add a durable source-directory pointer, asset map, and
agent tools around it. The workflow remains the record and asset-generation
recipe while the folder is its mutable output.
This preserves the guided flow but continues coupling game identity to one workflow. It must explain games created without a workflow and games with multiple asset workflows.
O5 — Game resource owns source, workflows are attached recipes
Create a game resource that owns the directory and metadata. Zero or more workflows may generate or transform its assets. Templates are creation inputs. The project agent operates on the game resource and generic file tools are scoped to its source root.
This most directly matches the requested lifecycle, but adds a resource type, server capabilities, UI integration, persistence, deletion, copying, and migration work.
Design questions
- Q1 — Canonical identity: Is the game a NodeTool project, a new game document, a workflow, or only a workspace folder? Which object owns the stable id?
- Q2 — Source authority: Which state is authoritative for project structure, installed asset mappings, Godot version, and template origin? What is stored in the database versus the source tree?
- Q3 — Workspace assignment: Does every game receive a workspace row, or a reserved directory inside a project workspace? How does the project-agent thread resolve it without relying on a workflow binding?
- Q4 — Agent scope: Should generic file tools be scoped to the game source root, or should game-specific tools accept project-relative paths? How is accidental editing of another game prevented?
- Q5 — Template role: Is template use a one-time copy, a recorded upstream, or an ongoing merge source? Is creating a blank Godot project supported?
- Q6 — Asset installation: What interface copies a NodeTool asset into the
game, chooses a stable destination, writes
.tresor scene references, and records provenance? Is the current slot contract retained as an optional helper rather than the project model? - Q7 — Asset updates: How does a later generation replace one installed asset without rerunning a whole export? How are file-extension changes, sprite-frame layout changes, and references handled?
- Q8 — Workflow relationship: Can a game have zero, one, or many asset
workflows? How does a workflow target a game without owning it? Should the
ExportGodotProjectnode be replaced by an asset-install node, narrowed to a one-time bootstrap node, or retired? - Q9 — Agent interface depth: What small interface hides workspace resolution, asset materialization, provenance updates, reference checks, verification results, and build output handling? Avoid one tool for each file operation when generic file tools already cover source editing.
- Q10 — Arbitrary Godot code: Which Godot files may the agent write? The product direction says any file, so any restriction must be a security rule, not a template convention.
- Q11 — Execution security: Is agent-authored GDScript trusted, approved per run, containerized, delegated to an isolated worker, or never run on the host? How are imports, editor plugins, network access, subprocesses, and filesystem access handled?
- Q12 — Permission categories: Which operations are reads, writes, executes,
or external actions?
verify_godot_projectcannot remain a read if it runs arbitrary project scripts. - Q13 — Cloud behavior: Should cloud verification materialize the whole source tree into scratch storage, run in an isolated worker, and absorb only declared outputs? If execution is unavailable, what checks still run?
- Q14 — Builds: Where do desktop, web, mobile, and source-zip exports live? Are builds workspace files, assets, jobs, or all three with one owner?
- Q15 — Versioning and recovery: Are game source snapshots stored by the workspace, as archives, in Git, or as game-document versions? What happens after a bad agent edit?
- Q16 — Concurrency: How are agent edits, workflow asset installs, Godot imports, and builds serialized or checked for stale writes?
- Q17 — UI integration: How does a creator open the game, inspect files, see installed assets and verification status, download source, and start the project agent?
- Q18 — Migration: How are existing workflow-backed games with
settings.gameandgames/<slug>adopted without moving or overwriting their source? - Q19 — Copy and delete: What does copying a game copy? What does deletion remove? How are shared NodeTool assets handled?
- Q20 — Extensibility: Can the same ownership model later support imported Godot repositories, Git-backed projects, multiple levels, plug-ins, and games that do not use a shipped asset manifest?
Minimum product scenarios
The selected design must describe these scenarios without hidden manual steps.
A1 — Start from a template
- Create a game named “Autumn Fox.”
- Seed the platformer template into its source directory.
- Give the project agent the game identity and source root.
- Let the agent replace the movement script and scene structure.
- Verify or report why execution is unavailable.
- Reopen the same game in a later conversation.
A2 — Start without a shipped template
- Create an empty Godot 4 project.
- Let the agent write
project.godot, scenes, scripts, and tests. - Add generated art and audio.
- Verify and export it without inventing a template manifest.
A3 — Regenerate one asset
- Select the current player sprite’s NodeTool source asset.
- Generate and check a replacement.
- Install it into the existing game.
- Update dependent Godot resources only when the layout changed.
- Preserve all source edits and other assets.
- Record the new provenance and keep the old version recoverable.
A4 — Multiple asset workflows
- Attach one workflow for character sheets and another for music.
- Run either workflow independently.
- Install selected outputs into one game.
- Do not make either workflow the game’s owner.
A5 — Agent-authored code fails
- The agent edits several scripts.
- A syntax check or smoke test fails.
- Return exact script errors and retain the changed source for inspection.
- Let the agent repair or restore the previous version.
- Never claim that a skipped or failed check passed.
A6 — Cloud workspace
- Create and edit a game in object storage.
- Install generated assets without requiring a local filesystem.
- Run storage-only validation.
- Either execute Godot in an isolated worker or return a specific unavailable result.
- Preserve the same source and asset mappings when later opened locally.
A7 — Existing guided-flow game
- Open a workflow with
settings.gameand an existinggames/<slug>folder. - Adopt that folder as the authoritative source without recopying its template.
- Keep the existing generation workflow as an attached recipe.
- Preserve all edited scripts, scenes, generated assets, and verification history.
Decision criteria
A preferred design should:
- make the mutable game source the clear authority
- let the agent write arbitrary valid Godot source without template-specific restrictions
- keep the agent’s file scope narrow enough to prevent cross-game writes
- separate project creation, asset installation, source verification, and build export
- keep workflows useful without making a workflow mandatory
- hide asset-copy and Godot-resource bookkeeping behind a small interface
- preserve NodeTool asset provenance and project ownership
- work with local and virtual workspaces
- classify and isolate code execution correctly
- provide recovery from bad edits and stale concurrent writes
- give the UI and agent one stable game id
- migrate current games without data loss
- keep a downloaded Godot project independent of NodeTool
Risks the review must address
- R1 — Host code execution: GDScript run by Godot can act with the Godot process’s OS permissions. A timeout is not isolation.
- R2 — Split authority: Database metadata, workflow settings, and source files can disagree about the current game.
- R3 — Lost edits: An asset refresh, template update, or stale agent write can overwrite source created in another turn.
- R4 — Broken references: Moving or changing generated files can leave
.tscn,.tres, scripts, and import sidecars pointing at missing paths. - R5 — Untraceable assets: A copied PNG or WAV can lose the id and generation record of its NodeTool source.
- R6 — Cloud divergence: A design that depends on
localDirmay work in Electron and fail in cloud storage. - R7 — Unbounded project copies: Source archives and build outputs can become large duplicates with unclear retention.
- R8 — Path identity: Deriving a directory from a mutable display name can orphan the project after rename or collide with another game.
- R9 — Project deletion: Workspace files and shared assets have different ownership semantics and may be deleted too much or too little.
- R10 — Tool sprawl: Adding shallow tools for every Godot file action can make the agent interface larger without hiding difficult behavior.
Existing implementation that can be reused
The new design should preserve useful modules unless the ownership model makes them obsolete:
- slot schemas and fill acceptance in
packages/protocol/src/game-assets.ts - deterministic Godot resource ids and resource writers in
packages/godot/ - game checker nodes in the image and audio node packages
- media-ref byte loading and project-scoped asset creation
- the workspace interface and local or virtual adapters
- template loading and placeholder projects in
packages/godot-templates/ - reference checks in
packages/godot/src/check.tsandpackages/game-nodes/src/project.ts - Godot import, script-check, and smoke-run result shapes
- project ownership, project-agent threads, and resource-change notifications
- the CLI harness registry and existing game pipeline fixtures
Reuse does not require preserving the current ExportGodotProject interface or
keeping a workflow as the game record.
Existing tests and harness coverage
Current behavior is covered in these areas:
packages/godot/tests/tests deterministic project writing and reference checkspackages/godot-templates/tests/tests template manifests and optional real Godot executionpackages/game-nodes/tests/game-nodes.test.tstests the export node, partial fills, refresh behavior, outputs, and errorspackages/agents/tests/capabilities-godot.test.tstests agent export and verificationpackages/protocoltests the game manifest, slot prompts, and graph builderpackages/cli/fixtures/graph-resources/platformer-asset-pack.fake.jsonruns a graph fixture through project exportpackages/cli/src/harness/registry.tsregisters the Godot game pipeline checksweb/src/components/setup/game/__tests__/tests guided-flow summaries and verification reporting
The review should identify which tests remain contract tests, which should be replaced, and what new end-to-end fixture proves agent-owned source survives asset updates.
Likely affected areas
This list is an impact map, not a proposed patch:
| Area | Current role |
|---|---|
packages/protocol/src/game-assets.ts |
Template slot and filled-asset contracts |
packages/godot/ |
Pure Godot text-resource writer and checker |
packages/godot-templates/ |
Shipped starter projects and headless runner |
packages/game-nodes/ |
Template nodes, fill resolution, project join, export node |
packages/agents/src/capabilities/godot* |
Agent template export and verification tools |
.agents/skills/godot-game/SKILL.md |
Current template-first agent procedure |
packages/runtime/src/workspace.ts |
Local and virtual file interface |
packages/models/src/{project,workspace}.ts |
Persistent project and workspace ownership |
packages/protocol/src/api-schemas/projects.ts |
Project resources shown in the UI |
packages/websocket/src/session/chat-turn.ts |
Project-agent workspace resolution |
packages/websocket/src/trpc/routers/projects.ts |
Project summaries, tabs, lifecycle |
web/src/components/setup/game/ |
Guided game creation and landing state |
packages/protocol/src/game-graph.ts |
Current template-slot workflow builder |
docs/creation-flows/game-prd.md |
Current workflow-as-game product decision |
packages/cli/src/harness/registry.ts |
Required headless verification surface |
Out of scope for this design question
- choosing a specific game premise, visual style, or shipped template
- improving model-generated sprite quality
- implementing a Godot source editor in the browser
- adding a general Git hosting product
- deciding which platforms NodeTool should export first
- implementing the selected architecture in this document
The design may require Git, a browser editor, or an isolated worker later. If so, state the dependency and keep the initial interface compatible with it.