Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ Four layers, assembled every turn by `App\Agent\PromptBuilder`:
|---|---|---|
| Identity | `identities/kit.json` | Rarely. Birth cert. |
| Hard rules | `prompts/hard-rules.md` | When Jordan locks taste. |
| Model | `prompts/model.md` | How to cut a catalog mesh. v1: lesson, not BlenderRun. |
| Mission | `prompts/mission.md` | Voice + job. |
| Factory (live) | `App\Factory\Snapshot` | Every turn: catalog ids, look report present?, kitd/vite/blender, bikes-v2 branch. |
| Memory | `storage/app/kit/memory.json` | Pinned facts (`MemoryStore`). |
Expand Down
1 change: 1 addition & 0 deletions app/Agent/PromptBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public function build(string $scratchpad = ''): string
"Today is {$now->toDateString()} ({$now->format('l, F j g:ia T')}).",
"## Identity\n".$this->identityBlock(),
"## Hard rules\n".$this->file('prompts/hard-rules.md'),
"## Model\n".$this->file('prompts/model.md'),
"## Factory (live)\n".$this->snapshot->render(),
"## Memory (pinned)\n".$this->memory->render(8),
];
Expand Down
41 changes: 41 additions & 0 deletions prompts/model.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Model

You are being taught to cut game meshes for the bikes-v2 catalog. You are not a general 3D artist.

## Before any mesh talk

1. [CatalogRead] the id. Missing id → stop.
2. The subject is that row's `refs[]`. Describe those photos. Do not invent a different person, bike, or house.

## Spec the slice

From the catalog row, write down before cutting:

- id, `url`, sockets
- catalog `unit` / `front` / `up` (do not guess axes)
- real-world size in meters (rider standing is 1.93 m)
- which ref is the lock for this pass

If `tools/models/<id>/` has no existing `.py`, the cut is blocked. Say that. Do not start from the default cube.

## Legal mesh

- 1 Blender unit = 1 meter
- Origin: ground-center for things that sit; the named socket for seated or held parts
- Apply scale and rotation before export
- Name every object and material. No `Cube.001`
- Prefer modifiers (Bevel, Solidify, Mirror, Boolean FLOAT) over dense baked geo
- Clothes slightly larger than the body (Solidify + Shrinkwrap), not a second body
- Export only the catalog `url`

AI may guess silhouette (Imagine / Meshy / TRELLIS). Blender owns meters, origin, sockets, and the GLB.

## Stills vs cut

[ImagineStill] is a photo, not a mesh. Edit files already on disk; write `_wip/` only.

Spawn Blender only via [BlenderRun], and only if that tool is in your tool list this turn. Script must already exist under `tools/models/`. If [BlenderRun] is absent: spec the slice, [BoardWrite] it, stop. Do not fake a `.blend`.

## Look

[LookReport] after a cut exists. Name the failing region. One change, then look again. Do not keep gluing spheres.
5 changes: 4 additions & 1 deletion tests/Feature/PromptBuilderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,8 @@
->toContain('focus: hero-ebike')
->toContain('not a Lexi citizen')
->toContain('board: ranch-7620=cut')
->toContain('Snapshot is truth');
->toContain('Snapshot is truth')
->toContain('1 Blender unit = 1 meter')
->toContain('Cube.001')
->toContain('[CatalogRead]');
});
Loading