Use when reviewing UI for accessibility — WCAG 2.2 AA, keyboard nav, focus, ARIA, contrast, screen-reader semantics — even on 'is this a11y-OK?' or 'mach das barrierefrei'.
The English summary is being prepared. Showing the original description.
Use when creating a Laravel migration — table prefixes, column naming, multi-tenant awareness, php artisan make:migration. Other stacks: use stack-native migration tooling.
The English summary is being prepared. Showing the original description.
See how to installReview the instructions the agent will receive before you install.
Use this skill when the user asks to create a database migration, add a column, create a table, or modify the schema.
./agents/ and AGENTS.md for table prefixes, column naming, multi-tenant setup.php artisan make:migration create_xyz_table (or add_column, etc.).decimal for money.php artisan migrate), then rollback (php artisan migrate:rollback) to confirm reversibility.decimal for money — never float.down(), or a roll-forward plan in the file
(see § The recovery contract below). Silence is the violation.Some projects use multiple database connections. Check config/database.php for connections.
| Check | How |
|---|---|
| Available connections | config/database.php → 'connections' array |
| Migration directories | database/migrations/ (default), check for additional directories |
| Custom migrate commands | php artisan list migrate — look for project-specific commands |
Always determine which database the table belongs to before creating a migration.
php artisan make:migration create_example_table
return new class extends Migration {
public function up(): void
{
Schema::connection('api_database')->create('example_table', function (Blueprint $table): void {
$table->id();
$table->unsignedBigInteger('customer_id');
$table->string('name');
$table->boolean('is_active')->default(true);
$table->timestamps();
$table->softDeletes();
$table->foreign('customer_id')
->references('id')
->on('customers')
// Choose the referential action; never inherit it from a
// template. See "Referential action is a decision" below.
->onDelete('cascade'); // cascade: rows here are expendable
// WITHOUT their customer
$table->index('is_active');
});
}
public function down(): void
{
Schema::connection('api_database')->dropIfExists('example_table');
}
};
php artisan make:migration:customer AddWeatherColumn --table=cl_lv_weather
Customer database tables use the cl_ prefix (e.g. cl_user, cl_lv_weather).
return new class extends Migration {
public function up(): void
{
Schema::connection('my_connection')->table('example', function (Blueprint $table): void {
$table->unsignedInteger('new_column')->after('existing_column');
});
}
public function down(): void
{
Schema::connection('my_connection')->table('example', function (Blueprint $table): void {
$table->dropColumn('new_column');
});
}
};
# Default connection
php artisan migrate # development
php artisan migrate --env=testing # testing
# Multi-tenant / custom — check AGENTS.md or module docs for project-specific commands
# Example: php artisan migrate:tenants, php artisan migrate --database=tenant
core/migrations/).{entity}_id (e.g. customer_id, user_id)is_ prefix (e.g. is_active, is_default)upload_date, deleted_at)unsignedBigInteger for foreign keys referencing id() columns->after('column') to place new columns logicallyEvery migration declares one of these, and silence is the violation:
down() that restores the prior state; orThe second branch is not a lighter obligation. A migration taking it records, in its own file comments, all three of:
Vague intent or missing detail is the violation. The plan lives in the migration file and lands in the same diff, because a plan documented "later" somewhere else is a plan nobody can review at the moment it matters.
The template above labels its onDelete('cascade') as one branch, not a
default. Copying it unchanged is how a delete of one customer silently removes
records that had independent value.
| The child row, without its parent, is | Action | What happens |
|---|---|---|
| expendable — it only means something as part of the parent | cascade | deleted with the parent |
| self-valued — it is a record in its own right (an invoice, an audit row, a payment) | restrict (or no action) | the parent delete FAILS until the child is dealt with |
| survivable — it outlives the parent with the link removed | set null | the column is nulled; requires a nullable column |
Two consequences worth stating because they are the ones missed:
restrict is the safe default for anything a finance, audit, or legal reader
would expect to still exist. A failed delete is a conversation; a cascaded
delete is a recovery.set null needs the foreign-key column to be nullable, and it needs the
application to handle the orphan state. Choosing it without both is choosing a
constraint error later.Soft deletes do not interact with this: onDelete fires on a real DELETE,
so a soft-deleting parent never triggers it. If the model soft-deletes, the
referential action describes what happens on a force-delete or a purge, and that
is the case to decide against.
->after('column') for column ordering — MariaDB respects it, and it matters for readability.down() that restores the prior
state, or the three-part roll-forward plan in the migration file. Neither is
optional; choosing between them is.float for money — use decimal.Before finalizing a migration, run the adversarial-review skill.
Focus on the "Database migrations" attack questions: Can this destroy data? Is rollback possible?
No reviews yet. Tell others what you thought.
No login needed. Share how it worked for you, ask a question, or note where it did not run.
No comments yet. Be the first to write one.
Use when reviewing UI for accessibility — WCAG 2.2 AA, keyboard nav, focus, ARIA, contrast, screen-reader semantics — even on 'is this a11y-OK?' or 'mach das barrierefrei'.
The English summary is being prepared. Showing the original description.
Use when defining or auditing the activation event — aha-moment selection, retention correlation, falsifiable definition. Triggers on 'what is our aha moment', 'redefine activation'.
The English summary is being prepared. Showing the original description.
Use when capturing an architectural decision — file naming, next ADR number, Status / Context / Decision / Consequences, index regen; fires even without saying 'ADR'.
The English summary is being prepared. Showing the original description.
Adversarial critique — devil's advocate, stress-test, honest teardown ('poke holes', 'be brutal', 'was hältst du davon'); explicit request only. Routine code or design review → code-review.
The English summary is being prepared. Showing the original description.
Use when reading, creating, or updating agent documentation, module docs, roadmaps, or AGENTS.md. Understands the full .augment/, agents/, and copilot-instructions structure.
The English summary is being prepared. Showing the original description.
Use for an adversarial red-team / blue-team / auditor review of an AI agent's CONFIG + behaviour (rules, skills, MCP, hooks, permissions) — attack-chain → defensive-gap list, not a code audit.
The English summary is being prepared. Showing the original description.