chore(db): regenerate baseline migration from corrected schema

drizzle-kit generate against the now-prod-aligned schema produces a
single baseline migration covering all 35 tables.

VERIFIED: 0000_baseline_prod_2026_05_19.sql was compared column-for-column
and type-for-type against the drizzle-kit pull introspection of tia_prod.
Table sets identical, all columns and types match. The baseline is a
faithful representation of production.

This baseline will be marked as already-applied in prod's
__drizzle_migrations table (done out-of-band, not in git), so the migrator
runs nothing on the next deploy. It exists purely as the reference point
for future schema diffs.

Adds drizzle/README.md documenting the baseline reset and the migration
workflow going forward.
This commit is contained in:
Manohar Gupta 2026-05-23 12:25:20 +05:30
parent a3d3a140ed
commit edd239fa69
4 changed files with 3396 additions and 0 deletions

View file

@ -0,0 +1,430 @@
CREATE TYPE "public"."child_sex" AS ENUM('male', 'female', 'other');--> statement-breakpoint
CREATE TYPE "public"."child_stage" AS ENUM('newborn', 'infant', 'solids_start', 'toddler_early', 'toddler_late', 'preschool');--> statement-breakpoint
CREATE TYPE "public"."member_role" AS ENUM('admin', 'caregiver', 'viewer');--> statement-breakpoint
CREATE TYPE "public"."diaper_type" AS ENUM('wet', 'dirty', 'both', 'dry');--> statement-breakpoint
CREATE TYPE "public"."feed_method" AS ENUM('bottle', 'breast_left', 'breast_right', 'breast_both', 'cup', 'spoon', 'finger', 'self');--> statement-breakpoint
CREATE TYPE "public"."feed_type" AS ENUM('breast_milk', 'formula', 'solid', 'water', 'other');--> statement-breakpoint
CREATE TYPE "public"."sleep_type" AS ENUM('nap', 'night');--> statement-breakpoint
CREATE TABLE "admin_sessions" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"admin_id" uuid NOT NULL,
"session_token" text NOT NULL,
"expires" timestamp with time zone NOT NULL,
"created_at" timestamp with time zone DEFAULT now(),
CONSTRAINT "admin_sessions_session_token_unique" UNIQUE("session_token")
);
--> statement-breakpoint
CREATE TABLE "admins" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"username" varchar(50) NOT NULL,
"password_hash" varchar(255) NOT NULL,
"role" varchar(20) DEFAULT 'admin',
"created_at" timestamp with time zone DEFAULT now(),
"last_login" timestamp with time zone,
CONSTRAINT "admins_username_unique" UNIQUE("username"),
CONSTRAINT "admins_role_check" CHECK ((role)::text = ANY (ARRAY['super_admin','admin','support']))
);
--> statement-breakpoint
CREATE TABLE "password_resets" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"user_id" uuid NOT NULL,
"token" text NOT NULL,
"expires_at" timestamp with time zone NOT NULL,
"used_at" timestamp with time zone,
CONSTRAINT "password_resets_token_unique" UNIQUE("token")
);
--> statement-breakpoint
CREATE TABLE "member_profiles" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"user_id" uuid NOT NULL,
"family_id" uuid NOT NULL,
"slug" text NOT NULL,
"display_name" text NOT NULL,
"bio" text,
"avatar_url" text,
"is_public" boolean DEFAULT false NOT NULL,
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
"updated_at" timestamp with time zone DEFAULT now() NOT NULL,
CONSTRAINT "member_profiles_user_id_unique" UNIQUE("user_id")
);
--> statement-breakpoint
CREATE TABLE "product_clicks" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"product_id" uuid NOT NULL,
"clicked_at" timestamp with time zone DEFAULT now() NOT NULL,
"referrer" text,
"ip_hash" text
);
--> statement-breakpoint
CREATE TABLE "recommended_products" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"profile_id" uuid NOT NULL,
"title" text NOT NULL,
"description" text,
"url" text NOT NULL,
"image_url" text,
"category" text DEFAULT 'general' NOT NULL,
"display_order" integer DEFAULT 0 NOT NULL,
"is_active" boolean DEFAULT true NOT NULL,
"created_at" timestamp with time zone DEFAULT now() NOT NULL
);
--> statement-breakpoint
CREATE TABLE "ai_usage" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"family_id" uuid,
"user_id" uuid,
"intent" text,
"model_used" text,
"prompt_tokens" integer,
"completion_tokens" integer,
"total_tokens" integer,
"cost_estimate_paise" numeric(10, 4),
"duration_ms" integer,
"created_at" timestamp with time zone DEFAULT now() NOT NULL
);
--> statement-breakpoint
CREATE TABLE "chat_messages" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"session_id" uuid NOT NULL,
"role" varchar(20) NOT NULL,
"content" text NOT NULL,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "chat_sessions" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"child_id" uuid NOT NULL,
"title" varchar(255) DEFAULT 'New conversation' NOT NULL,
"created_at" timestamp with time zone DEFAULT now(),
"updated_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "audit_log" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"family_id" uuid,
"user_id" uuid,
"action" varchar(50) NOT NULL,
"resource_type" varchar(50),
"resource_id" uuid,
"ip_address" varchar(45),
"user_agent" text,
"metadata" jsonb DEFAULT '{}'::jsonb,
"created_at" timestamp with time zone DEFAULT now() NOT NULL
);
--> statement-breakpoint
CREATE TABLE "log_corrections" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"family_id" uuid NOT NULL,
"dose_id" uuid NOT NULL,
"original_value" jsonb NOT NULL,
"corrected_value" jsonb NOT NULL,
"reason" text,
"corrected_by" uuid,
"created_at" timestamp with time zone DEFAULT now() NOT NULL
);
--> statement-breakpoint
CREATE TABLE "accounts" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"user_id" uuid NOT NULL,
"type" text NOT NULL,
"provider" text NOT NULL,
"provider_account_id" text NOT NULL,
"refresh_token" text,
"access_token" text,
"expires_at" timestamp,
"token_type" text,
"scope" text,
"id_token" text,
"session_state" text
);
--> statement-breakpoint
CREATE TABLE "sessions" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"session_token" text NOT NULL,
"user_id" uuid NOT NULL,
"expires" timestamp NOT NULL,
CONSTRAINT "sessions_session_token_unique" UNIQUE("session_token")
);
--> statement-breakpoint
CREATE TABLE "users" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"name" text,
"email" text NOT NULL,
"email_verified" timestamp,
"image" text,
"created_at" timestamp DEFAULT now() NOT NULL,
"updated_at" timestamp DEFAULT now() NOT NULL,
"password_hash" varchar(255),
"password_updated_at" timestamp with time zone,
CONSTRAINT "users_email_unique" UNIQUE("email")
);
--> statement-breakpoint
CREATE TABLE "verification_tokens" (
"identifier" text NOT NULL,
"token" text NOT NULL,
"expires" timestamp NOT NULL
);
--> statement-breakpoint
CREATE TABLE "children" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"family_id" uuid NOT NULL,
"name" text NOT NULL,
"birth_date" date NOT NULL,
"sex" "child_sex",
"stage" "child_stage" DEFAULT 'newborn' NOT NULL,
"image_url" text,
"created_at" timestamp DEFAULT now() NOT NULL,
"updated_at" timestamp DEFAULT now() NOT NULL
);
--> statement-breakpoint
CREATE TABLE "families" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"name" text NOT NULL,
"tier" varchar(20) DEFAULT 'free',
"max_children" integer DEFAULT 1,
"max_members" integer DEFAULT 2,
"pediatrician_phone" text,
"created_at" timestamp DEFAULT now() NOT NULL,
"updated_at" timestamp DEFAULT now() NOT NULL
);
--> statement-breakpoint
CREATE TABLE "family_invites" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"family_id" uuid NOT NULL,
"email" text NOT NULL,
"role" "member_role" DEFAULT 'viewer' NOT NULL,
"token" text NOT NULL,
"expires_at" timestamp NOT NULL,
"created_at" timestamp DEFAULT now() NOT NULL,
CONSTRAINT "family_invites_token_unique" UNIQUE("token")
);
--> statement-breakpoint
CREATE TABLE "family_members" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"family_id" uuid NOT NULL,
"user_id" uuid NOT NULL,
"role" "member_role" DEFAULT 'caregiver' NOT NULL,
"created_at" timestamp DEFAULT now() NOT NULL
);
--> statement-breakpoint
CREATE TABLE "attachments" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"family_id" uuid NOT NULL,
"log_entry_id" uuid,
"r2_key" text NOT NULL,
"r2_thumbnail_key" text,
"mime_type" text,
"size_bytes" integer,
"uploaded_by" uuid,
"created_at" timestamp with time zone DEFAULT now() NOT NULL
);
--> statement-breakpoint
CREATE TABLE "memories" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"family_id" uuid NOT NULL,
"child_id" uuid,
"title" text,
"description" text,
"taken_at" timestamp with time zone,
"r2_key" text NOT NULL,
"r2_thumbnail_key" text,
"mime_type" text,
"size_bytes" integer,
"width" integer,
"height" integer,
"vision_caption" text,
"vision_tags" text[],
"vision_embedding" vector(1536),
"is_private" boolean DEFAULT false NOT NULL,
"processing_status" text DEFAULT 'uploading' NOT NULL,
"uploaded_by" uuid,
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
"updated_at" timestamp with time zone DEFAULT now() NOT NULL
);
--> statement-breakpoint
CREATE TABLE "diapers_logs" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"child_id" uuid NOT NULL,
"type" "diaper_type" NOT NULL,
"notes" text,
"logged_at" timestamp DEFAULT now() NOT NULL,
"created_at" timestamp DEFAULT now() NOT NULL
);
--> statement-breakpoint
CREATE TABLE "feeds" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"child_id" uuid NOT NULL,
"type" "feed_type" NOT NULL,
"method" "feed_method",
"amount_ml" real,
"notes" text,
"logged_at" timestamp DEFAULT now() NOT NULL,
"created_at" timestamp DEFAULT now() NOT NULL
);
--> statement-breakpoint
CREATE TABLE "growth" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"child_id" uuid NOT NULL,
"measured_at" timestamp NOT NULL,
"weight_kg" real,
"height_cm" real,
"head_circumference_cm" real,
"notes" text,
"created_at" timestamp DEFAULT now() NOT NULL
);
--> statement-breakpoint
CREATE TABLE "medications" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"child_id" uuid NOT NULL,
"name" text NOT NULL,
"dosage" text,
"frequency" text,
"start_date" date NOT NULL,
"end_date" date,
"active" boolean DEFAULT true NOT NULL,
"notes" text,
"created_at" timestamp DEFAULT now() NOT NULL
);
--> statement-breakpoint
CREATE TABLE "milestone_achievements" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"child_id" uuid NOT NULL,
"family_id" uuid NOT NULL,
"milestone_key" text NOT NULL,
"achieved_at" date NOT NULL,
"notes" text,
"created_at" timestamp with time zone DEFAULT now() NOT NULL
);
--> statement-breakpoint
CREATE TABLE "sleeps" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"child_id" uuid NOT NULL,
"type" "sleep_type" NOT NULL,
"started_at" timestamp,
"ended_at" timestamp,
"duration_minutes" integer,
"notes" text,
"logged_at" timestamp DEFAULT now() NOT NULL,
"created_at" timestamp DEFAULT now() NOT NULL
);
--> statement-breakpoint
CREATE TABLE "vaccinations" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"child_id" uuid NOT NULL,
"vaccine_name" text NOT NULL,
"scheduled_date" date NOT NULL,
"given_date" date,
"status" text DEFAULT 'pending' NOT NULL,
"provider" text,
"lot_number" text,
"notes" text,
"created_at" timestamp DEFAULT now() NOT NULL
);
--> statement-breakpoint
CREATE TABLE "allergies" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"child_id" uuid NOT NULL,
"name" varchar(255) NOT NULL,
"severity" varchar(50) DEFAULT 'mild',
"notes" text,
"created_at" timestamp with time zone DEFAULT now(),
"updated_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "doctor_visits" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"child_id" uuid NOT NULL,
"doctor_name" varchar(255) NOT NULL,
"reason" varchar(255),
"visit_date" date NOT NULL,
"notes" text,
"created_at" timestamp with time zone DEFAULT now(),
"updated_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "illness_logs" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"child_id" uuid NOT NULL,
"name" varchar(255) NOT NULL,
"start_date" date NOT NULL,
"end_date" date,
"notes" text,
"created_at" timestamp with time zone DEFAULT now(),
"updated_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "medication_doses" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"medicine_id" uuid NOT NULL,
"family_id" uuid NOT NULL,
"administered_at" timestamp with time zone DEFAULT now() NOT NULL,
"administered_by" uuid,
"amount_given" text,
"notes" text,
"created_at" timestamp with time zone DEFAULT now() NOT NULL
);
--> statement-breakpoint
CREATE TABLE "medicines" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"child_id" uuid NOT NULL,
"name" varchar(255) NOT NULL,
"dose" varchar(255),
"notes" text,
"reminder_time" varchar(10),
"created_at" timestamp with time zone DEFAULT now(),
"updated_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "support_responses" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"ticket_id" uuid,
"admin_id" uuid,
"message" text NOT NULL,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "support_tickets" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"family_id" uuid,
"user_id" uuid,
"email" varchar(255) NOT NULL,
"subject" varchar(255) NOT NULL,
"description" text,
"status" varchar(20) DEFAULT 'open',
"priority" varchar(20) DEFAULT 'normal',
"created_at" timestamp with time zone DEFAULT now(),
"updated_at" timestamp with time zone DEFAULT now(),
CONSTRAINT "support_tickets_status_check" CHECK ((status)::text = ANY (ARRAY['open','in_progress','resolved','closed'])),
CONSTRAINT "support_tickets_priority_check" CHECK ((priority)::text = ANY (ARRAY['low','normal','high','urgent']))
);
--> statement-breakpoint
ALTER TABLE "diapers_logs" ADD CONSTRAINT "diapers_logs_child_id_children_id_fk" FOREIGN KEY ("child_id") REFERENCES "public"."children"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "feeds" ADD CONSTRAINT "feeds_child_id_children_id_fk" FOREIGN KEY ("child_id") REFERENCES "public"."children"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "growth" ADD CONSTRAINT "growth_child_id_children_id_fk" FOREIGN KEY ("child_id") REFERENCES "public"."children"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "medications" ADD CONSTRAINT "medications_child_id_children_id_fk" FOREIGN KEY ("child_id") REFERENCES "public"."children"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "sleeps" ADD CONSTRAINT "sleeps_child_id_children_id_fk" FOREIGN KEY ("child_id") REFERENCES "public"."children"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "vaccinations" ADD CONSTRAINT "vaccinations_child_id_children_id_fk" FOREIGN KEY ("child_id") REFERENCES "public"."children"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
CREATE INDEX "member_profiles_slug_idx" ON "member_profiles" USING btree ("slug");--> statement-breakpoint
CREATE INDEX "product_clicks_product_idx" ON "product_clicks" USING btree ("product_id","clicked_at");--> statement-breakpoint
CREATE INDEX "recommended_products_profile_idx" ON "recommended_products" USING btree ("profile_id","display_order");--> statement-breakpoint
CREATE INDEX "ai_usage_created_idx" ON "ai_usage" USING btree ("created_at");--> statement-breakpoint
CREATE INDEX "ai_usage_family_idx" ON "ai_usage" USING btree ("family_id");--> statement-breakpoint
CREATE INDEX "audit_family_idx" ON "audit_log" USING btree ("family_id","created_at");--> statement-breakpoint
CREATE INDEX "idx_audit_log_action" ON "audit_log" USING btree ("action");--> statement-breakpoint
CREATE INDEX "idx_audit_log_created" ON "audit_log" USING btree ("created_at");--> statement-breakpoint
CREATE INDEX "idx_audit_log_family" ON "audit_log" USING btree ("family_id");--> statement-breakpoint
CREATE INDEX "idx_audit_log_user" ON "audit_log" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "log_corrections_dose_idx" ON "log_corrections" USING btree ("dose_id");--> statement-breakpoint
CREATE UNIQUE INDEX "accounts_provider_idx" ON "accounts" USING btree ("provider","provider_account_id");--> statement-breakpoint
CREATE UNIQUE INDEX "verification_tokens_idx" ON "verification_tokens" USING btree ("identifier","token");--> statement-breakpoint
CREATE INDEX "children_family_idx" ON "children" USING btree ("family_id");--> statement-breakpoint
CREATE UNIQUE INDEX "invite_token_idx" ON "family_invites" USING btree ("token");--> statement-breakpoint
CREATE UNIQUE INDEX "family_members_family_id_user_id_key" ON "family_members" USING btree ("family_id","user_id");--> statement-breakpoint
CREATE INDEX "attachments_family_idx" ON "attachments" USING btree ("family_id");--> statement-breakpoint
CREATE INDEX "memories_family_idx" ON "memories" USING btree ("family_id");--> statement-breakpoint
CREATE INDEX "memories_child_idx" ON "memories" USING btree ("child_id");--> statement-breakpoint
CREATE INDEX "memories_embedding_idx" ON "memories" USING ivfflat ("vision_embedding" vector_cosine_ops) WITH (lists=100);--> statement-breakpoint
CREATE INDEX "milestone_child_idx" ON "milestone_achievements" USING btree ("child_id");--> statement-breakpoint
CREATE UNIQUE INDEX "milestone_achievements_child_milestone_unique" ON "milestone_achievements" USING btree ("child_id","milestone_key");--> statement-breakpoint
CREATE INDEX "medication_doses_family_idx" ON "medication_doses" USING btree ("family_id");--> statement-breakpoint
CREATE INDEX "medication_doses_medicine_idx" ON "medication_doses" USING btree ("medicine_id");

55
drizzle/README.md Normal file
View file

@ -0,0 +1,55 @@
# Tia — Database Migrations
This folder is **source code** and is committed to git. It is consumed by the
deploy pipeline (`pnpm db:migrate`, run on container start — see `Dockerfile`).
## Baseline reset — 2026-05-19
The project's first 16 migrations (`0000``0015`) plus a `manual/` folder were
hand-rolled SQL applied directly via the Dokploy database terminal. They were
**never** run through Drizzle's migrator, so:
- prod had no `__drizzle_migrations` tracking table;
- the `drizzle/` folder was gitignored, so migration SQL never reached the server;
- `schema.ts` had drifted well behind the real production schema.
To fix this we performed a **Path A baseline reset**:
1. `pg_dump` backup of prod taken and stored off-server.
2. `drizzle-kit pull` introspected the live prod schema (35 tables).
3. `src/db/schema/*.ts` was rewritten to match prod exactly.
4. Legacy migrations were archived to `_archived_pre_baseline_2026-05-19/`
(also retained in git history).
5. A single fresh baseline — `0000_baseline_prod_2026_05_19.sql` — was generated
and **verified column-for-column against the introspected prod schema**.
6. Prod's `drizzle.__drizzle_migrations` table was created and seeded with one
row marking `0000_baseline_prod_2026_05_19` as already applied, so the
migrator treats prod as up-to-date and runs nothing on the next deploy.
## Normal workflow from here
```bash
# 1. Edit src/db/schema/*.ts
# 2. Generate a migration from the diff:
pnpm db:generate # writes drizzle/000N_<name>.sql
# 3. Review the generated SQL by eye.
# 4. Apply locally against the dev DB:
pnpm db:migrate
# 5. Commit schema + migration together, then push.
# Dokploy redeploys; the migrator applies it in prod on container start.
```
## Hard rules
- **Never** edit a migration file after it has been pushed. Fix-forward with a
new migration instead.
- **Never** run schema-changing SQL directly against prod. It becomes drift.
- The `drizzle/` folder must stay **out** of `.gitignore`.
## RLS policies
Five log tables (`feeds`, `diapers_logs`, `sleeps`, `vaccinations`, `growth`)
plus `children` / `family_members` carry row-level-security policies in prod.
These are **not** modelled in the `pgTable` definitions and are managed
separately in the database. Drizzle migrations will not recreate them — keep
that in mind if you ever rebuild the DB from scratch.

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,13 @@
{
"version": "7",
"dialect": "postgresql",
"entries": [
{
"idx": 0,
"version": "7",
"when": 1779518962214,
"tag": "0000_baseline_prod_2026_05_19",
"breakpoints": true
}
]
}