mAi
0f3c30a647
Paliad CI gate / build (push) Has been cancelled
Paliad CI gate / test-go (push) Has been cancelled
Paliad CI gate / deploy (push) Has been cancelled
feat(scenario-builder): B0 schema foundation + minimal API ( m/paliad#153 )
...
t-paliad-340 — B0 of edison's 7-slice train (PRD §7.1). DB-only: schema
+ RLS land, dev-only test route exercises the surface, no user-facing
change. B1 wires the actual builder UI on top.
Migration 157 (additive on the legacy mig-145 scenarios table — 0 rows
in prod, safe to relax):
- paliad.scenarios gets owner_id / status / origin_project_id /
promoted_project_id / stichtag / notes. spec drops NOT NULL and the
scenarios_unique_per_scope constraint drops (the builder allows
multiple scratch + Unbenanntes Szenario rows per user).
- New tables: scenario_proceedings, scenario_events, scenario_shares.
- paliad.projects.origin_scenario_id for the promote-to-project audit
trail (the FK lands now; the wizard ships in B5).
- paliad.can_see_scenario(uuid) STABLE SECURITY DEFINER helper covering
owner / share / global_admin / two legacy paths.
- Replacement RLS on scenarios + RLS on the three new tables; legacy
service + handlers stay live and unchanged.
PRD §5.1 deviations called out in the migration header:
- proceeding_type_id is integer (live schema), not uuid (PRD draft).
- FK target is paliad.users, matching the rest of paliad's schema.
Go surface:
- ScenarioBuilderService — list/create/get-deep/patch scenarios,
add/patch/delete proceedings, add/patch/delete events,
add/delete shares. Writes wrap in transactions with set_config(
paliad.audit_reason, ..., true) per event_choice_service.go pattern.
- /api/builder/scenarios/* — handlers register under a builder/
prefix so the legacy /api/scenarios surface still works.
- /dev/scenario-builder — single-page HTML form gated to
PaliadinOwnerEmail, exercises the B0 surface without Postman.
- Live-DB integration test (TEST_DATABASE_URL gated) covers
create + list + deep-get + share + visibility negatives + patch.
Audit-first: every DDL block ran clean via BEGIN/ROLLBACK against
the live DB before commit; end-to-end sanity (insert chain + CHECK
constraints + CASCADE-on-delete) verified via the Supabase MCP.
bun build clean. go vet + go test -short ./... green.
2026-05-27 23:50:14 +02:00
..
2026-04-16 13:54:19 +02:00
2026-04-16 13:54:19 +02:00
2026-04-16 13:54:19 +02:00
2026-04-16 13:54:19 +02:00
2026-04-16 13:54:19 +02:00
2026-04-16 13:54:19 +02:00
2026-04-16 13:54:19 +02:00
2026-04-30 03:42:25 +02:00
2026-04-16 13:54:19 +02:00
2026-04-30 03:42:25 +02:00
2026-04-16 13:54:19 +02:00
2026-04-30 03:42:25 +02:00
2026-04-16 13:54:19 +02:00
2026-04-16 13:54:19 +02:00
2026-04-16 13:54:19 +02:00
2026-04-16 13:54:19 +02:00
2026-04-16 13:54:19 +02:00
2026-04-16 13:54:19 +02:00
2026-04-16 13:54:19 +02:00
2026-04-16 13:54:19 +02:00
2026-04-16 13:54:19 +02:00
2026-04-16 13:54:19 +02:00
2026-04-16 17:11:02 +02:00
2026-04-16 17:11:02 +02:00
2026-04-17 11:59:49 +02:00
2026-04-17 11:59:49 +02:00
2026-04-17 13:54:32 +02:00
2026-04-17 13:54:32 +02:00
2026-04-18 20:26:11 +02:00
2026-04-18 20:26:11 +02:00
2026-04-20 12:34:38 +02:00
2026-04-20 12:34:38 +02:00
2026-04-20 13:17:24 +02:00
2026-04-20 13:17:24 +02:00
2026-04-20 17:35:38 +02:00
2026-04-20 17:35:38 +02:00
2026-04-20 17:35:38 +02:00
2026-04-20 17:35:38 +02:00
2026-04-23 01:00:31 +02:00
2026-04-23 01:00:31 +02:00
2026-04-25 23:37:51 +02:00
2026-04-25 23:37:51 +02:00
2026-04-27 11:47:10 +02:00
2026-04-27 11:47:10 +02:00
2026-04-27 14:59:03 +02:00
2026-04-27 14:59:03 +02:00
2026-04-27 19:34:56 +02:00
2026-05-25 17:42:06 +02:00
2026-04-28 13:05:22 +02:00
2026-04-28 13:05:22 +02:00
2026-04-29 22:09:39 +02:00
2026-04-29 22:09:39 +02:00
2026-04-30 03:42:25 +02:00
2026-05-25 17:42:06 +02:00
2026-04-30 10:54:46 +02:00
2026-04-30 10:54:46 +02:00
2026-04-30 11:11:47 +02:00
2026-04-30 11:11:47 +02:00
2026-04-30 12:49:04 +02:00
2026-04-30 12:49:04 +02:00
2026-04-30 16:41:38 +02:00
2026-04-30 16:41:38 +02:00
2026-05-04 14:36:50 +02:00
2026-05-04 14:36:50 +02:00
2026-05-04 14:36:50 +02:00
2026-05-04 14:36:50 +02:00
2026-05-04 14:57:54 +02:00
2026-05-04 14:57:54 +02:00
2026-05-04 17:03:58 +02:00
2026-05-04 17:03:58 +02:00
2026-05-04 17:03:58 +02:00
2026-05-04 17:03:58 +02:00
2026-05-05 00:05:12 +02:00
2026-05-05 00:05:12 +02:00
2026-05-05 00:05:12 +02:00
2026-05-05 00:05:12 +02:00
2026-05-05 00:05:12 +02:00
2026-05-05 00:05:12 +02:00
2026-05-05 00:05:12 +02:00
2026-05-05 00:05:12 +02:00
2026-05-05 01:25:03 +02:00
2026-05-05 01:25:03 +02:00
2026-05-05 01:49:01 +02:00
2026-05-05 01:49:01 +02:00
2026-05-05 02:19:37 +02:00
2026-05-05 02:19:37 +02:00
2026-05-05 02:48:31 +02:00
2026-05-05 02:48:31 +02:00
2026-05-05 03:17:46 +02:00
2026-05-05 03:17:46 +02:00
2026-05-05 03:46:45 +02:00
2026-05-05 03:46:45 +02:00
2026-05-05 04:32:50 +02:00
2026-05-05 04:32:50 +02:00
2026-05-05 11:18:38 +02:00
2026-05-05 11:18:38 +02:00
2026-05-05 11:18:38 +02:00
2026-05-05 11:22:14 +02:00
2026-05-05 11:18:38 +02:00
2026-05-05 11:18:38 +02:00
2026-05-05 11:53:13 +02:00
2026-05-05 11:53:13 +02:00
2026-05-05 13:29:47 +02:00
2026-05-05 13:29:47 +02:00
2026-05-06 12:37:08 +02:00
2026-05-06 12:37:08 +02:00
2026-05-06 15:13:26 +02:00
2026-05-06 15:13:26 +02:00
2026-05-06 16:45:19 +02:00
2026-05-06 16:45:19 +02:00
2026-05-07 12:51:37 +02:00
2026-05-07 12:51:37 +02:00
2026-05-07 20:58:57 +02:00
2026-05-07 20:58:57 +02:00
2026-05-07 21:49:33 +02:00
2026-05-07 21:49:33 +02:00
2026-05-07 22:00:26 +02:00
2026-05-07 22:00:26 +02:00
2026-05-07 22:21:45 +02:00
2026-05-07 22:21:45 +02:00
2026-05-07 22:41:18 +02:00
2026-05-07 22:41:18 +02:00
2026-05-08 02:13:58 +02:00
2026-05-08 02:13:58 +02:00
2026-05-08 16:00:21 +02:00
2026-05-08 16:00:21 +02:00
2026-05-08 16:23:12 +02:00
2026-05-08 16:23:12 +02:00
2026-05-08 16:54:34 +02:00
2026-05-08 16:54:34 +02:00
2026-05-08 17:16:57 +02:00
2026-05-08 17:16:57 +02:00
2026-05-08 17:16:57 +02:00
2026-05-08 17:16:57 +02:00
2026-05-08 19:15:44 +02:00
2026-05-08 19:15:44 +02:00
2026-05-08 19:20:52 +02:00
2026-05-08 19:20:52 +02:00
2026-05-08 19:42:05 +02:00
2026-05-08 19:42:05 +02:00
2026-05-08 20:21:13 +02:00
2026-05-08 20:21:13 +02:00
2026-05-08 21:52:50 +02:00
2026-05-08 21:52:50 +02:00
2026-05-08 22:01:44 +02:00
2026-05-08 22:01:44 +02:00
2026-05-08 22:16:55 +02:00
2026-05-08 22:16:55 +02:00
2026-05-08 23:33:53 +02:00
2026-05-08 23:33:53 +02:00
2026-05-09 15:33:20 +02:00
2026-05-09 15:33:20 +02:00
2026-05-09 16:07:17 +02:00
2026-05-09 16:07:17 +02:00
2026-05-15 00:19:19 +02:00
2026-05-15 00:19:19 +02:00
2026-05-15 00:19:31 +02:00
2026-05-15 00:19:31 +02:00
2026-05-15 00:19:37 +02:00
2026-05-15 00:19:37 +02:00
2026-05-15 00:28:38 +02:00
2026-05-15 00:28:38 +02:00
2026-05-15 00:28:49 +02:00
2026-05-15 00:28:49 +02:00
2026-05-15 00:29:00 +02:00
2026-05-15 00:29:00 +02:00
2026-05-15 00:40:50 +02:00
2026-05-15 00:40:50 +02:00
2026-05-15 00:40:59 +02:00
2026-05-15 00:40:59 +02:00
2026-05-15 01:01:08 +02:00
2026-05-15 01:01:08 +02:00
2026-05-15 01:01:17 +02:00
2026-05-15 01:01:17 +02:00
2026-05-15 01:37:34 +02:00
2026-05-15 01:37:34 +02:00
2026-05-15 01:37:57 +02:00
2026-05-15 01:37:57 +02:00
2026-05-15 17:53:08 +02:00
2026-05-15 17:53:08 +02:00
2026-05-16 01:17:23 +02:00
2026-05-16 01:17:23 +02:00
2026-05-16 01:29:31 +02:00
2026-05-16 01:29:31 +02:00
2026-05-17 12:30:53 +02:00
2026-05-17 12:30:53 +02:00
2026-05-18 11:46:12 +02:00
2026-05-18 11:46:12 +02:00
2026-05-18 12:13:13 +02:00
2026-05-18 12:13:13 +02:00
2026-05-18 15:39:03 +02:00
2026-05-18 15:39:03 +02:00
2026-05-18 15:05:46 +02:00
2026-05-18 17:28:19 +02:00
2026-05-18 17:29:21 +02:00
2026-05-18 17:33:01 +02:00
2026-05-18 17:46:08 +02:00
2026-05-18 17:46:08 +02:00
2026-05-19 12:44:27 +02:00
2026-05-19 12:44:27 +02:00
2026-05-19 12:51:52 +02:00
2026-05-19 12:51:52 +02:00
2026-05-20 09:50:07 +02:00
2026-05-20 09:50:07 +02:00
2026-05-20 09:47:14 +02:00
2026-05-20 09:47:14 +02:00
2026-05-20 09:47:14 +02:00
2026-05-20 09:47:14 +02:00
2026-05-20 09:52:28 +02:00
2026-05-20 09:52:28 +02:00
2026-05-20 13:05:27 +02:00
2026-05-20 13:05:27 +02:00
2026-05-20 13:26:23 +02:00
2026-05-20 13:26:23 +02:00
2026-05-20 13:55:56 +02:00
2026-05-20 13:55:56 +02:00
2026-05-20 14:43:42 +02:00
2026-05-20 14:43:42 +02:00
2026-05-20 14:46:36 +02:00
2026-05-20 14:46:36 +02:00
2026-05-20 14:55:55 +02:00
2026-05-20 14:55:55 +02:00
2026-05-20 14:55:55 +02:00
2026-05-20 14:55:55 +02:00
2026-05-20 15:24:06 +02:00
2026-05-20 15:24:06 +02:00
2026-05-20 15:38:30 +02:00
2026-05-20 15:38:30 +02:00
2026-05-20 15:50:21 +02:00
2026-05-20 15:50:21 +02:00
2026-05-20 19:15:32 +02:00
2026-05-20 19:15:32 +02:00
2026-05-22 15:17:24 +02:00
2026-05-22 15:17:24 +02:00
2026-05-23 00:06:08 +02:00
2026-05-23 00:06:08 +02:00
2026-05-23 02:19:55 +02:00
2026-05-23 02:19:55 +02:00
2026-05-25 13:57:38 +02:00
2026-05-25 13:57:38 +02:00
2026-05-25 14:54:51 +02:00
2026-05-25 14:54:51 +02:00
2026-05-25 15:28:37 +02:00
2026-05-25 15:28:37 +02:00
2026-05-25 15:46:09 +02:00
2026-05-25 15:46:09 +02:00
2026-05-25 15:40:24 +02:00
2026-05-25 16:12:13 +02:00
2026-05-25 15:49:39 +02:00
2026-05-25 15:49:39 +02:00
2026-05-25 15:56:19 +02:00
2026-05-25 15:56:19 +02:00
2026-05-25 16:06:35 +02:00
2026-05-25 16:06:35 +02:00
2026-05-25 16:45:07 +02:00
2026-05-25 16:45:07 +02:00
2026-05-25 17:03:34 +02:00
2026-05-25 17:03:34 +02:00
2026-05-25 16:51:35 +02:00
2026-05-25 16:51:35 +02:00
2026-05-25 17:29:13 +02:00
2026-05-25 17:29:13 +02:00
2026-05-25 17:25:19 +02:00
2026-05-25 17:25:19 +02:00
2026-05-26 15:19:54 +02:00
2026-05-26 15:19:54 +02:00
2026-05-26 13:58:33 +02:00
2026-05-26 13:58:33 +02:00
2026-05-26 15:12:12 +02:00
2026-05-26 15:12:12 +02:00
2026-05-26 15:37:10 +02:00
2026-05-26 15:37:10 +02:00
2026-05-26 15:43:36 +02:00
2026-05-26 15:43:36 +02:00
2026-05-26 17:59:58 +02:00
2026-05-26 17:59:58 +02:00
2026-05-26 19:53:24 +02:00
2026-05-26 20:32:58 +02:00
2026-05-26 17:48:56 +02:00
2026-05-26 17:48:56 +02:00
2026-05-26 19:23:40 +02:00
2026-05-26 19:23:40 +02:00
2026-05-26 19:23:40 +02:00
2026-05-26 19:23:40 +02:00
2026-05-26 19:23:40 +02:00
2026-05-26 19:23:40 +02:00
2026-05-26 20:04:40 +02:00
2026-05-26 20:04:40 +02:00
2026-05-26 20:21:12 +02:00
2026-05-26 20:21:12 +02:00
2026-05-26 20:54:01 +02:00
2026-05-26 20:54:01 +02:00
2026-05-26 21:21:38 +02:00
2026-05-26 21:21:38 +02:00
2026-05-27 10:09:33 +02:00
2026-05-27 10:09:33 +02:00
2026-05-27 15:02:01 +02:00
2026-05-27 15:02:01 +02:00
2026-05-27 15:11:48 +02:00
2026-05-27 15:11:48 +02:00
2026-05-27 15:25:53 +02:00
2026-05-27 15:25:53 +02:00
2026-05-27 23:50:14 +02:00
2026-05-27 23:50:14 +02:00