# Copilot Instructions – Artworks Module (SkinBase)

> **This file defines HOW Copilot must generate code.**
> It is a strict instruction set.
> If there is a conflict between generated code and these rules,
> **these rules override everything.**

---

## 1. Global Rules (MANDATORY)

Copilot MUST:

* Target **Laravel 12**
* Use **PHP 8.3+ syntax**
* Follow **Eloquent best practices**
* Respect **SoftDeletes**
* Respect **FK relationships**
* Generate **clean, readable, maintainable code**

Copilot MUST NOT:

* Reference legacy tables (`wallz`, old categories, old views)
* Generate MyISAM tables
* Generate hard deletes for user content
* Put counters on hot tables
* Use IDs in URLs
* Mix responsibilities across models

---

## 2. Authoritative Schema Reference

The canonical schema for artworks is defined in:

```
.copilot/artworks.md
```

Copilot MUST:

* Read this file before generating any code
* Match table names, columns, relations exactly
* Never invent fields or tables unless explicitly allowed

---

## 3. Models Generation Rules

When generating Eloquent models:

### Required models

Copilot MUST generate:

* `App\Models\Artwork`
* `App\Models\ArtworkTranslation`
* `App\Models\ArtworkStats`
* `App\Models\ArtworkComment`
* `App\Models\ArtworkDownload`

### Model requirements

Each model MUST:

* Declare `$fillable`
* Define all relationships
* Use `SoftDeletes` **only when allowed**
* Include PHPDoc blocks for relations
* Use type-hinted return values

### Forbidden

Copilot MUST NOT:

* Add business logic into models
* Perform stat mutations in models
* Use observers unless explicitly requested

---

## 4. Relationships (STRICT)

Copilot MUST implement these exact relations:

### Artwork

```php
belongsTo(User::class)
hasMany(ArtworkTranslation::class)
hasOne(ArtworkStats::class)
belongsToMany(Category::class)
hasMany(ArtworkComment::class)
hasMany(ArtworkDownload::class)
```

### ArtworkTranslation

```php
belongsTo(Artwork::class)
```

### ArtworkStats

```php
belongsTo(Artwork::class)
```

### ArtworkComment

```php
belongsTo(Artwork::class)
belongsTo(User::class)
```

### ArtworkDownload

```php
belongsTo(Artwork::class)
```

---

## 5. Query & Scope Rules

Copilot MUST define these scopes on `Artwork`:

```php
scopePublic($query)
scopeApproved($query)
scopePublished($query)
```

Public queries MUST always include:

```php
deleted_at IS NULL
is_public = true
is_approved = true
```

Copilot MUST NOT:

* Eager-load stats in list views
* Use `offset` pagination for feeds
* Load unnecessary relations by default

---

## 6. Controller Generation Rules

When generating controllers:

Copilot MUST:

* Use **thin controllers**
* Delegate logic to services/actions if needed
* Validate input using Form Requests
* Use route-model binding with `slug`
* Handle soft-deleted content properly

Copilot MUST NOT:

* Query raw DB tables directly
* Bypass scopes
* Return unfiltered content

---

## 7. Routing Rules

Routes MUST:

* Use **slug-based routing**
* Never expose numeric IDs
* Respect category hierarchy
* Be SEO-friendly

Example (valid):

```
/photography/abstract/dark/night-city
```

Invalid:

```
/artwork/123
```

---

## 8. Soft Delete Rules

Copilot MUST:

* Use `delete()` (soft delete) for user content
* Use `restore()` for recovery
* Use `forceDelete()` **only** when explicitly requested

When content is soft-deleted:

* It must disappear from public browsing
* It must remain accessible to admins

---

## 9. Stats & High-Load Rules

Copilot MUST:

* Treat stats as **derived data**
* Update stats via jobs / services
* Never increment counters inline in controllers
* Assume Redis may be present

Copilot MUST NOT:

* Store counters on `artworks`
* Use `increment()` directly on hot rows

---

## 10. Search Rules

Copilot MAY:

* Use MySQL FULLTEXT
* Use external search engines (if requested)

Copilot MUST NOT:

* Search file paths
* Search binary metadata
* Assume Elasticsearch exists unless specified

---

## 11. Forbidden Patterns (NEVER GENERATE)

❌ Hard deletes on artworks
❌ Legacy column names
❌ Polymorphic abuse
❌ Fat controllers
❌ Magic numbers
❌ Inline SQL in controllers
❌ Business logic in migrations

---

## 12. Extension Rules

Copilot MAY generate new features ONLY if:

* They do not modify core tables
* They follow the same architectural principles
* They are isolated in new tables/services

Allowed examples:

* tags
* EXIF metadata
* versioning
* reporting/flagging
* API resources

---

## 13. Error Handling

Copilot MUST:

* Throw meaningful exceptions
* Return proper HTTP codes
* Use 404 for missing public content
* Use 410 or 301 for deleted content (if requested)

---

## 14. Final Instruction (ABSOLUTE)

> **Copilot must treat this file and `artworks.md`
> as non-negotiable contracts.**

If unsure:

* ask for clarification
* do NOT guess
* do NOT invent schema

---

### ✅ End of Copilot Instructions
