--- name: ogt-docs-define-code description: Create technical architecture definitions covering services, data models, APIs, and system components. Use when defining HOW systems work at a technical level - interfaces, contracts, data flow, and architectural decisions. --- # OGT Docs - Define Code Complete guide for creating technical architecture definitions. ## Overview Technical definitions establish the architectural foundation of your system. They define services, data models, APIs, and system boundaries at an interface level - NOT implementation details. ```mermaid mindmap root((Technical
Definitions)) Services Contracts Dependencies Error handling State management Data Models Entities Relationships Validation Migrations APIs Endpoints Request/Response Authentication Versioning Architecture Layers Patterns Boundaries Integration ``` ## When to Use This Skill Use `ogt-docs-define-code` when defining: - Service interfaces and contracts - Data models and entity relationships - API endpoints and schemas - Architectural patterns and layers - System boundaries and integrations - State management approaches ## Folder Structure ``` docs/definitions/technical/ ├── service_layer/ │ ├── definition.md # Service layer philosophy │ ├── contracts.md # Service contracts │ ├── patterns.md # Required patterns │ ├── error_handling.md # Error conventions │ └── .version │ ├── data_model/ │ ├── definition.md # Data layer philosophy │ ├── entities/ # Entity definitions │ │ ├── user.md │ │ ├── campaign.md │ │ └── creature.md │ ├── relationships.md # Entity relationships │ ├── validation.md # Validation rules │ └── .version │ ├── api_design/ │ ├── definition.md # API philosophy │ ├── rest_conventions.md # REST standards │ ├── authentication.md # Auth approach │ ├── versioning.md # Version strategy │ ├── error_responses.md # Error format │ └── .version │ ├── state_management/ │ ├── definition.md # State philosophy │ ├── global_state.md # Global state approach │ ├── local_state.md # Component state │ ├── persistence.md # Storage strategy │ └── .version │ ├── authentication/ │ ├── definition.md # Auth architecture │ ├── flows.md # Auth flows │ ├── tokens.md # Token management │ ├── providers.md # OAuth providers │ └── .version │ └── integration/ ├── definition.md # Integration philosophy ├── external_apis.md # Third-party APIs ├── webhooks.md # Webhook patterns └── .version ``` --- ## Technical Definition Types ### 1. Service Definition Defines a service's interface, responsibilities, and contracts. #### Example: technical/services/search_service/ ``` services/search_service/ ├── definition.md ├── interface.md ├── dependencies.md ├── error_handling.md ├── state.md └── .version ``` #### definition.md ````markdown # Definition: Search Service ## Overview The Search Service provides full-text search capabilities across all content types. It maintains an in-memory index and exposes a simple query interface. ## Responsibilities ### Primary Responsibilities - Build and maintain search index - Execute search queries - Return ranked results ### NOT Responsible For - Data fetching (delegates to content services) - UI rendering - Navigation ## Architecture Context ```mermaid flowchart LR subgraph consumers ["Consumers"] UI[Search UI] API[API Layer] end subgraph service ["Search Service"] SS[SearchService] IDX[Index] end subgraph deps ["Dependencies"] CS[CreatureService] IS[ItemService] AS[AbilityService] end UI --> SS API --> SS SS --> IDX SS --> CS SS --> IS SS --> AS ``` ```` ## Key Decisions | Decision | Choice | Rationale | | --------------- | -------------------- | ------------------------------------- | | Index location | Client-side (memory) | Low latency, offline capable | | Index library | MiniSearch | Small, fast, fuzzy matching | | Update strategy | Rebuild on change | Simple, data size is small | | Query debounce | 100ms | Balance responsiveness and efficiency | ## Quality Attributes | Attribute | Requirement | | ------------ | ----------------------------------------- | | Latency | <16ms per query | | Memory | <10MB index size | | Availability | Works offline | | Consistency | Eventually consistent (rebuild on change) | ## Related Definitions - [Service Layer](../service_layer/) - [Feature: Global Search](../../features/global_search/) ```` #### interface.md ```markdown # Interface: Search Service ## TypeScript Interface ```typescript /** * Search Service Interface * * Provides full-text search across content types. * * @example * const results = await searchService.search('fireball'); * const creatures = await searchService.search('dragon', { types: ['creature'] }); */ interface ISearchService { /** * Initialize the search index. * Must be called before any search operations. * Fetches all content and builds the index. * * @returns Promise that resolves when index is ready * @throws IndexBuildError if content fetch fails */ initialize(): Promise; /** * Check if the index is ready for queries. */ isReady(): boolean; /** * Execute a search query. * * @param query - Search query string * @param options - Optional search configuration * @returns Array of search results, ranked by relevance */ search(query: string, options?: SearchOptions): SearchResult[]; /** * Add a document to the index. * Called when new content is created. * * @param document - Document to index */ addDocument(document: Searchable): void; /** * Remove a document from the index. * Called when content is deleted. * * @param id - Document ID to remove */ removeDocument(id: string): void; /** * Rebuild the entire index. * Called when bulk changes occur. */ rebuild(): Promise; /** * Get index statistics. */ getStats(): IndexStats; } ```` ## Types ```typescript interface SearchOptions { /** Filter by content types */ types?: ContentType[]; /** Maximum results to return */ limit?: number; /** Minimum relevance score (0-1) */ minScore?: number; /** Fields to search (default: all) */ fields?: string[]; } interface SearchResult { /** Unique identifier */ id: string; /** Content type */ type: ContentType; /** Display name */ name: string; /** URL-friendly identifier */ slug: string; /** Relevance score (0-1) */ score: number; /** Matched terms with positions */ matches: Match[]; } interface Match { /** Field that matched */ field: string; /** Matched term */ term: string; /** Position in field */ position: number; } interface Searchable { /** Unique identifier */ id: string; /** Content type */ type: ContentType; /** Primary searchable text */ name: string; /** URL-friendly identifier */ slug: string; /** Additional searchable text */ description?: string; /** Searchable tags */ tags?: string[]; } interface IndexStats { /** Number of indexed documents */ documentCount: number; /** Index size in bytes */ sizeBytes: number; /** Last rebuild timestamp */ lastRebuilt: Date; /** Documents by type */ byType: Record; } type ContentType = "creature" | "item" | "ability" | "campaign" | "scenario"; ``` ## Method Contracts ### initialize() **Preconditions:** - Content services are available - Not already initialized **Postconditions:** - Index contains all current content - `isReady()` returns true **Errors:** - `IndexBuildError`: Content fetch failed ### search() **Preconditions:** - `isReady()` returns true - Query is non-empty string **Postconditions:** - Returns results sorted by score descending - Results match query with fuzzy tolerance **Errors:** - `IndexNotReadyError`: Called before initialize - `InvalidQueryError`: Empty or invalid query ### addDocument() / removeDocument() **Preconditions:** - Index is initialized **Postconditions:** - Index reflects the change - Change is immediately searchable **Errors:** - `IndexNotReadyError`: Called before initialize ```` #### dependencies.md ```markdown # Dependencies: Search Service ## Required Services ```mermaid flowchart TD SS[SearchService] CS[CreatureService] IS[ItemService] AS[AbilityService] CAS[CampaignService] SS -->|getAll| CS SS -->|getAll| IS SS -->|getAll| AS SS -->|getAll| CAS ```` ### CreatureService - **Method**: `getAll(): Promise` - **Purpose**: Fetch all creatures for indexing - **Required**: Yes (Phase 0) ### ItemService - **Method**: `getAll(): Promise` - **Purpose**: Fetch all items for indexing - **Required**: Yes (Phase 0) ### AbilityService - **Method**: `getAll(): Promise` - **Purpose**: Fetch all abilities for indexing - **Required**: Yes (Phase 0) ### CampaignService - **Method**: `getAll(): Promise` - **Purpose**: Fetch all campaigns for indexing - **Required**: No (Phase 2) ## External Libraries ### MiniSearch - **Version**: ^6.0.0 - **Purpose**: Full-text search engine - **Usage**: Index storage and query execution ## Dependency Injection ```typescript interface SearchServiceDependencies { creatureService: ICreatureService; itemService: IItemService; abilityService: IAbilityService; campaignService?: ICampaignService; // Optional, Phase 2 } function createSearchService(deps: SearchServiceDependencies): ISearchService { return new SearchService(deps); } ``` ```` #### error_handling.md ```markdown # Error Handling: Search Service ## Error Types ```typescript /** Base error for search service */ class SearchServiceError extends Error { constructor(message: string, public code: string) { super(message); this.name = 'SearchServiceError'; } } /** Index not ready for queries */ class IndexNotReadyError extends SearchServiceError { constructor() { super('Search index not initialized. Call initialize() first.', 'INDEX_NOT_READY'); } } /** Index build failed */ class IndexBuildError extends SearchServiceError { constructor(cause: Error) { super(`Failed to build search index: ${cause.message}`, 'INDEX_BUILD_FAILED'); this.cause = cause; } } /** Invalid search query */ class InvalidQueryError extends SearchServiceError { constructor(query: string, reason: string) { super(`Invalid query "${query}": ${reason}`, 'INVALID_QUERY'); } } ```` ## Error Handling Patterns ### Initialization Errors ```typescript try { await searchService.initialize(); } catch (error) { if (error instanceof IndexBuildError) { // Log and show user-friendly message logger.error("Search index build failed", error); showNotification("Search is temporarily unavailable"); // App continues without search } } ``` ### Query Errors ```typescript function handleSearch(query: string) { try { return searchService.search(query); } catch (error) { if (error instanceof IndexNotReadyError) { // Index still building, show loading return { loading: true, results: [] }; } if (error instanceof InvalidQueryError) { // Invalid query, return empty return { loading: false, results: [] }; } throw error; // Unknown error, propagate } } ``` ## Recovery Strategies | Error | Strategy | | ------------------ | ---------------------------------------------- | | IndexBuildError | Retry with backoff, fallback to no-search mode | | IndexNotReadyError | Wait for initialization, show loading | | InvalidQueryError | Return empty results, no retry | ```` --- ### 2. Data Model Definition Defines entities, their structure, and relationships. #### Example: technical/data_model/entities/creature.md ```markdown # Entity: Creature ## Overview A Creature represents any living or animated being in the game world that can be encountered, fought, or interacted with. ## Schema ```typescript interface ICreature { // Identity id: string; // Unique identifier (UUID) slug: string; // URL-friendly name name: LocalizedText; // Display name // Classification type: CreatureType; // beast, humanoid, undead, etc. subtype?: string; // goblinoid, demon, etc. size: CreatureSize; // tiny, small, medium, large, huge, gargantuan alignment: Alignment; // lawful-good to chaotic-evil // Stats attributes: ICreatureAttributes; // Combat abilities: IAbility[]; // Actions, reactions, features equipment: IEquipment[]; // Equipped items // Lore contents: ICreatureContent[]; // Descriptions, GM notes // Relationships relationships: ICreatureRelationship[]; // Metadata _metadata: IEntryMetadata; createdAt: string; // ISO timestamp updatedAt: string; // ISO timestamp } ```` ## Field Definitions ### Identity Fields | Field | Type | Required | Description | | ------ | ------------- | -------- | --------------------------------- | | `id` | string | Yes | UUID v4, immutable | | `slug` | string | Yes | Lowercase, hyphenated, unique | | `name` | LocalizedText | Yes | Display name in supported locales | ### Classification Fields | Field | Type | Required | Values | | ----------- | ------------ | -------- | ---------------------------------------------------- | | `type` | CreatureType | Yes | beast, humanoid, undead, construct, etc. | | `subtype` | string | No | Further classification | | `size` | CreatureSize | Yes | tiny, small, medium, large, huge, gargantuan | | `alignment` | Alignment | Yes | 3x3 grid: lawful/neutral/chaotic × good/neutral/evil | ### Attributes ```typescript interface ICreatureAttributes { // Core stats attr_health: number; // Hit points attr_defense: number; // Armor class attr_difficulty: number; // Challenge rating // Ability scores (3-30, 10 = average) attr_str: number; // Strength attr_agi: number; // Agility/Dexterity attr_con: number; // Constitution attr_int: number; // Intelligence attr_wis: number; // Wisdom attr_cha: number; // Charisma } ``` ## Relationships ```mermaid erDiagram CREATURE ||--o{ ABILITY : has CREATURE ||--o{ EQUIPMENT : has CREATURE ||--o{ CONTENT : has CREATURE ||--o{ RELATIONSHIP : has CREATURE }o--|| CREATURE_TYPE : is CREATURE }o--|| SIZE : is ABILITY }o--|| ABILITY_TYPE : is EQUIPMENT }o--|| ITEM : references ``` ### Related Entities | Entity | Relationship | Cardinality | | --------- | ---------------------------- | ----------- | | Ability | Creature HAS Abilities | 1:N | | Equipment | Creature HAS Equipment | 1:N | | Item | Equipment REFERENCES Item | N:1 | | Creature | Creature RELATES TO Creature | N:N | ## Validation Rules ### Required Fields - `id`: Must be valid UUID v4 - `slug`: Must be lowercase, hyphenated, 3-50 chars - `name.en`: English name required - `type`: Must be valid CreatureType - `size`: Must be valid CreatureSize ### Value Constraints - `attr_health`: 1-9999 - `attr_defense`: 1-30 - `attr_difficulty`: 0-30 - Ability scores: 1-30 ### Business Rules - Slug must be unique within creatures - Cannot delete creature referenced by campaign - Type change requires re-validation of abilities ## Lifecycle ```mermaid stateDiagram-v2 [*] --> Draft: Create Draft --> Review: Submit Review --> Draft: Reject Review --> Published: Approve Published --> Published: Update Published --> Archived: Archive Archived --> [*]: Delete ``` ## Indexing | Field | Indexed | Purpose | | ----------------- | ----------- | ---------------- | | id | Primary key | Direct lookup | | slug | Unique | URL routing | | name.en | Full-text | Search | | type | Standard | Filtering | | \_metadata.status | Standard | Workflow queries | ``` --- ### 3. API Definition Defines API endpoints, request/response schemas, and conventions. #### Example: technical/api_design/ ``` api_design/ ├── definition.md ├── rest_conventions.md ├── endpoints/ │ ├── creatures.md │ ├── items.md │ └── auth.md ├── authentication.md ├── error_responses.md └── .version ```` #### rest_conventions.md ```markdown # REST Conventions ## URL Structure ```` {base_url}/api/{version}/{resource}/{id?}/{subresource?} ``` ### Examples ``` GET /api/v1/creatures # List creatures GET /api/v1/creatures/goblin # Get creature by slug POST /api/v1/creatures # Create creature PUT /api/v1/creatures/goblin # Update creature DELETE /api/v1/creatures/goblin # Delete creature GET /api/v1/creatures/goblin/abilities # Get creature's abilities ``` ## HTTP Methods | Method | Purpose | Idempotent | Body | |--------|---------|------------|------| | GET | Retrieve resource(s) | Yes | No | | POST | Create resource | No | Yes | | PUT | Replace resource | Yes | Yes | | PATCH | Partial update | Yes | Yes | | DELETE | Remove resource | Yes | No | ## Request Headers ### Required ``` Content-Type: application/json Accept: application/json ``` ### Authentication ``` Authorization: Bearer {token} ``` ### Optional ``` Accept-Language: en-US # Localization X-Request-ID: {uuid} # Request tracing ```` ## Response Format ### Success Response ```json { "data": { ... }, // Resource or array "meta": { // Pagination, etc. "page": 1, "pageSize": 25, "total": 100 } } ```` ### Single Resource ```json { "data": { "id": "123", "type": "creature", "attributes": { ... } } } ``` ### Collection ```json { "data": [ { "id": "123", ... }, { "id": "456", ... } ], "meta": { "page": 1, "pageSize": 25, "total": 50 } } ``` ## Pagination ### Query Parameters ``` ?page=1&pageSize=25 ?offset=0&limit=25 ``` ### Response Meta ```json { "meta": { "page": 1, "pageSize": 25, "total": 100, "totalPages": 4, "hasNext": true, "hasPrev": false } } ``` ## Filtering ### Query Parameters ``` ?filter[type]=humanoid ?filter[size]=medium,large ?filter[difficulty][gte]=5 ?filter[difficulty][lte]=10 ``` ### Operators | Operator | Meaning | Example | | ------------ | ------------------ | --------------------------------- | | (none) | Equals | `filter[type]=beast` | | `[ne]` | Not equals | `filter[type][ne]=beast` | | `[gt]` | Greater than | `filter[cr][gt]=5` | | `[gte]` | Greater or equal | `filter[cr][gte]=5` | | `[lt]` | Less than | `filter[cr][lt]=10` | | `[lte]` | Less or equal | `filter[cr][lte]=10` | | `[in]` | In list | `filter[type][in]=beast,humanoid` | | `[contains]` | Contains substring | `filter[name][contains]=dragon` | ## Sorting ``` ?sort=name # Ascending by name ?sort=-difficulty # Descending by difficulty ?sort=type,-name # Multiple fields ``` ## Status Codes ### Success | Code | Meaning | Usage | | ---- | ---------- | ----------------------- | | 200 | OK | GET, PUT, PATCH success | | 201 | Created | POST success | | 204 | No Content | DELETE success | ### Client Error | Code | Meaning | Usage | | ---- | ------------- | ------------------------ | | 400 | Bad Request | Invalid request body | | 401 | Unauthorized | Missing/invalid auth | | 403 | Forbidden | Insufficient permissions | | 404 | Not Found | Resource doesn't exist | | 409 | Conflict | Duplicate/conflict | | 422 | Unprocessable | Validation failed | ### Server Error | Code | Meaning | Usage | | ---- | ------------------- | -------------------- | | 500 | Internal Error | Unexpected error | | 503 | Service Unavailable | Maintenance/overload | ```` #### error_responses.md ```markdown # Error Responses ## Error Format ```json { "error": { "code": "VALIDATION_ERROR", "message": "Validation failed", "details": [ { "field": "name", "code": "REQUIRED", "message": "Name is required" } ], "requestId": "abc-123" } } ```` ## Error Codes ### Authentication Errors | Code | Status | Message | | ---------------- | ------ | ---------------------------- | | `AUTH_REQUIRED` | 401 | Authentication required | | `AUTH_INVALID` | 401 | Invalid authentication token | | `AUTH_EXPIRED` | 401 | Authentication token expired | | `AUTH_FORBIDDEN` | 403 | Insufficient permissions | ### Validation Errors | Code | Status | Message | | ------------------ | ------ | -------------------- | | `VALIDATION_ERROR` | 422 | Validation failed | | `REQUIRED` | 422 | Field is required | | `INVALID_FORMAT` | 422 | Invalid format | | `OUT_OF_RANGE` | 422 | Value out of range | | `TOO_LONG` | 422 | Value too long | | `DUPLICATE` | 409 | Value already exists | ### Resource Errors | Code | Status | Message | | ----------- | ------ | ------------------ | | `NOT_FOUND` | 404 | Resource not found | | `CONFLICT` | 409 | Resource conflict | | `GONE` | 410 | Resource deleted | ### Server Errors | Code | Status | Message | | --------------------- | ------ | --------------------- | | `INTERNAL_ERROR` | 500 | Internal server error | | `SERVICE_UNAVAILABLE` | 503 | Service unavailable | ## Error Examples ### 401 Unauthorized ```json { "error": { "code": "AUTH_REQUIRED", "message": "Authentication required", "requestId": "abc-123" } } ``` ### 404 Not Found ```json { "error": { "code": "NOT_FOUND", "message": "Creature 'invalid-slug' not found", "requestId": "abc-123" } } ``` ### 422 Validation Error ```json { "error": { "code": "VALIDATION_ERROR", "message": "Validation failed", "details": [ { "field": "name", "code": "REQUIRED", "message": "Name is required" }, { "field": "attr_health", "code": "OUT_OF_RANGE", "message": "Health must be between 1 and 9999" } ], "requestId": "abc-123" } } ``` ``` --- ## Signal Files for Technical Definitions ### Status Signals | Signal | Meaning | |--------|---------| | `.draft` | Definition in progress | | `.ready_for_review` | Ready for tech review | | `.approved` | Approved for implementation | | `.implemented` | Implementation exists | | `.deprecated` | No longer current | ### Attribution Signals | Signal | Meaning | |--------|---------| | `.approved_by_tech_lead` | Tech lead approved | | `.approved_by_architect` | Architect approved | | `.implemented_in` | Content: path to implementation | ### Content Signals | Signal | Content | |--------|---------| | `.version` | Schema version JSON | | `.breaking_changes` | Breaking changes from previous version | | `.migration_guide` | How to migrate from previous version | --- ## Quality Checklist Before requesting review: - [ ] Interface fully defined with TypeScript - [ ] All public methods documented with JSDoc - [ ] Preconditions and postconditions specified - [ ] Error types and handling defined - [ ] Dependencies explicitly listed - [ ] Relationship diagrams included (Mermaid) - [ ] No implementation details (interface only) - [ ] Related definitions linked - [ ] `.version` file created ```