LoomPattern
The pattern of a codebase: its feel rather than its facts. How it is built, how to find your way around it, where to start, and the conventions it keeps. Agents that work in the codebase keep it with their pattern tool, night weaving refines it from what they wove about it, and it is woven into the tapestry when the codebase is in play.
Kind: an object, used in responses.
Fields
Section titled “Fields”Every field is present in a response; empty ones are null.
| Field | Type | Description |
|---|---|---|
loomId | uuid | The loom that keeps the pattern. |
subjectKey | string | The codebase as a subject, normalised (lowercase, single-spaced), so the pattern is woven in when the codebase is present. |
name | string | The codebase’s name. |
architecture | string | null | How it is built, in a few sentences: “Clean architecture, DI, a message bus between services.” |
heuristics | string[] | How to find your way: “Services own logic; controllers only route.” |
keyFiles | string[] | Where to start: entry points and the files that explain the rest. |
conventions | string[] | The conventions it keeps: style, patterns, rules. |
threadIds | uuid[] | Threads night weaving refined the pattern from. Erasing one of them takes the pattern with it, as it takes a panel: what was derived from erased words must not outlive them. |
lastChangedBy | ThreadOrigin| null | Who last changed the pattern, and from where. |
revision | integer | Goes up by one every time the pattern changes. |
isEmpty | boolean | True when the pattern holds nothing: no architecture, heuristics, key files or conventions. Set by Maitento. |
tenantId | uuid | The id of the tenant it belongs to. |
id | uuid | The unique id. Use it in by-id routes and wherever another object refers to this one. |
dateCreated | datetime | When it was created, in UTC. |
dateUpdated | datetime | When it was last changed, in UTC. |
Example
Section titled “Example”{ "loomId": "3f2b8c1e-5d4a-4e6b-9c7d-2a1b0c9d8e7f", "subjectKey": "...", "name": "...", "architecture": "...", "heuristics": [ "..." ], "keyFiles": [ "..." ], "conventions": [ "..." ], "threadIds": [ "3f2b8c1e-5d4a-4e6b-9c7d-2a1b0c9d8e7f" ], "lastChangedBy": { "kind": "Manual", "interactionProcessId": "3f2b8c1e-5d4a-4e6b-9c7d-2a1b0c9d8e7f", "appProcessId": "3f2b8c1e-5d4a-4e6b-9c7d-2a1b0c9d8e7f", "agentId": "3f2b8c1e-5d4a-4e6b-9c7d-2a1b0c9d8e7f", "agentName": "...", "userId": "3f2b8c1e-5d4a-4e6b-9c7d-2a1b0c9d8e7f", "nightWeavingId": "3f2b8c1e-5d4a-4e6b-9c7d-2a1b0c9d8e7f" }, "revision": 0, "isEmpty": false, "tenantId": "3f2b8c1e-5d4a-4e6b-9c7d-2a1b0c9d8e7f", "id": "3f2b8c1e-5d4a-4e6b-9c7d-2a1b0c9d8e7f", "dateCreated": "2026-10-26T12:00:00.0000000Z", "dateUpdated": "2026-10-26T12:00:00.0000000Z"}Where it’s used
Section titled “Where it’s used”looms.pattern(GET /looms/by-id/{id}/patterns/by-name/{codebase})looms.patterns(GET /looms/by-id/{id}/patterns)looms.shapePattern(PUT /looms/by-id/{id}/patterns/by-name/{codebase})