angora-schema — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited angora-schema (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
src/data/schema/tables/*.ts to discover tables, then read the relevant files. One file per table.Whether the user gives you structured data or a vague description, always analyze first. Ask yourself:
media)Ask the user probing questions. Don't just accept the first description — refine it.
Every table gets:
id INTEGER PRIMARY KEY AUTOINCREMENTcreated_at TEXT NOT NULL DEFAULT (datetime('now'))When records will get their own pages (blog posts, case studies, team members, cities), add:
slug TEXT NOT NULL UNIQUE — URL-safe identifiermeta_title TEXT — for <title> tagmeta_description TEXT — for <meta name="description"> and OG tagsstatus TEXT NOT NULL DEFAULT 'draft' with CHECK (status IN ('draft', 'published')) — enables content staging, only published records renderExplain to the user why these fields matter (SEO, content staging, clean URLs).
Use media_id INTEGER REFERENCES media(id) for a primary image/asset. For multiple images, consider a junction table.
Before changing any files:
schema/db.select().from(testimonials).where(eq(testimonials.status, 'published')))Schema changes follow a three-step process:
src/data/schema/tables/One file per table. Example — src/data/schema/tables/testimonials.ts:
import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';
import { sql } from 'drizzle-orm';
import { media } from './media';
export const testimonials = sqliteTable('testimonials', {
id: integer('id').primaryKey({ autoIncrement: true }),
name: text('name').notNull(),
quote: text('quote').notNull(),
mediaId: integer('media_id').references(() => media.id),
status: text('status').notNull().default('draft'),
createdAt: text('created_at').notNull().default(sql`(datetime('now'))`),
});Then add the re-export to src/data/schema/index.ts:
export * from './tables/testimonials';pnpm db:generateThis creates a readable .sql file in src/data/migrations/. Show it to the user.
pnpm db:migrateEach step requires user approval before executing.
After applying, mention: "You can browse the data with pnpm db:studio whenever you're ready to seed some content."
text() for dates (ISO 8601 format via datetime('now')).integer() for booleans (0/1).public/media/.media table is the base — other tables reference it via media_id./angora-data for seeding or /angora-import for bulk inserts.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.