@soddong/agentic-domain-methodology 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/.tbls.yml +64 -0
  2. package/CHANGELOG.md +97 -0
  3. package/README.md +501 -0
  4. package/dist/database.d.ts +8 -0
  5. package/dist/database.d.ts.map +1 -0
  6. package/dist/database.js +76 -0
  7. package/dist/database.js.map +1 -0
  8. package/dist/fixtures.d.ts +13 -0
  9. package/dist/fixtures.d.ts.map +1 -0
  10. package/dist/fixtures.js +413 -0
  11. package/dist/fixtures.js.map +1 -0
  12. package/dist/index.d.ts +31 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +19 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/repositories.d.ts +54 -0
  17. package/dist/repositories.d.ts.map +1 -0
  18. package/dist/repositories.js +652 -0
  19. package/dist/repositories.js.map +1 -0
  20. package/dist/seed-apply.d.ts +20 -0
  21. package/dist/seed-apply.d.ts.map +1 -0
  22. package/dist/seed-apply.js +728 -0
  23. package/dist/seed-apply.js.map +1 -0
  24. package/dist/service.d.ts +107 -0
  25. package/dist/service.d.ts.map +1 -0
  26. package/dist/service.js +225 -0
  27. package/dist/service.js.map +1 -0
  28. package/dist/types.d.ts +356 -0
  29. package/dist/types.d.ts.map +1 -0
  30. package/dist/types.js +2 -0
  31. package/dist/types.js.map +1 -0
  32. package/dist/validators.d.ts +17 -0
  33. package/dist/validators.d.ts.map +1 -0
  34. package/dist/validators.js +297 -0
  35. package/dist/validators.js.map +1 -0
  36. package/docs/build.md +47 -0
  37. package/docs/configuration.md +33 -0
  38. package/docs/delivery.md +52 -0
  39. package/docs/operations.md +55 -0
  40. package/docs/publishing.md +84 -0
  41. package/docs/schema/generated/README.md +39 -0
  42. package/docs/schema/generated/methodology_activities.md +121 -0
  43. package/docs/schema/generated/methodology_activities.svg +143 -0
  44. package/docs/schema/generated/methodology_activity_artifact_requirements.md +129 -0
  45. package/docs/schema/generated/methodology_activity_artifact_requirements.svg +52 -0
  46. package/docs/schema/generated/methodology_activity_criteria.md +112 -0
  47. package/docs/schema/generated/methodology_activity_criteria.svg +52 -0
  48. package/docs/schema/generated/methodology_baseline_requirements.md +103 -0
  49. package/docs/schema/generated/methodology_baseline_requirements.svg +27 -0
  50. package/docs/schema/generated/methodology_code_groups.md +70 -0
  51. package/docs/schema/generated/methodology_code_groups.svg +49 -0
  52. package/docs/schema/generated/methodology_codes.md +88 -0
  53. package/docs/schema/generated/methodology_codes.svg +49 -0
  54. package/docs/schema/generated/methodology_common_blueprint_policies.md +104 -0
  55. package/docs/schema/generated/methodology_common_blueprint_policies.svg +72 -0
  56. package/docs/schema/generated/methodology_common_blueprint_policy_nodes.md +118 -0
  57. package/docs/schema/generated/methodology_common_blueprint_policy_nodes.svg +59 -0
  58. package/docs/schema/generated/methodology_handoff_requirements.md +130 -0
  59. package/docs/schema/generated/methodology_handoff_requirements.svg +27 -0
  60. package/docs/schema/generated/methodology_lifecycles.md +105 -0
  61. package/docs/schema/generated/methodology_lifecycles.svg +71 -0
  62. package/docs/schema/generated/methodology_methodologies.md +92 -0
  63. package/docs/schema/generated/methodology_methodologies.svg +92 -0
  64. package/docs/schema/generated/methodology_phase_processes.md +106 -0
  65. package/docs/schema/generated/methodology_phase_processes.svg +77 -0
  66. package/docs/schema/generated/methodology_phases.md +107 -0
  67. package/docs/schema/generated/methodology_phases.svg +77 -0
  68. package/docs/schema/generated/methodology_processes.md +98 -0
  69. package/docs/schema/generated/methodology_processes.svg +118 -0
  70. package/docs/schema/generated/methodology_schema_migrations.md +52 -0
  71. package/docs/schema/generated/methodology_schema_migrations.svg +27 -0
  72. package/docs/schema/generated/methodology_stage_activities.md +106 -0
  73. package/docs/schema/generated/methodology_stage_activities.svg +77 -0
  74. package/docs/schema/generated/methodology_stage_artifact_requirements.md +109 -0
  75. package/docs/schema/generated/methodology_stage_artifact_requirements.svg +52 -0
  76. package/docs/schema/generated/methodology_stage_criteria.md +112 -0
  77. package/docs/schema/generated/methodology_stage_criteria.svg +52 -0
  78. package/docs/schema/generated/methodology_stages.md +117 -0
  79. package/docs/schema/generated/methodology_stages.svg +121 -0
  80. package/docs/schema/generated/methodology_steps.md +105 -0
  81. package/docs/schema/generated/methodology_steps.svg +52 -0
  82. package/docs/schema/generated/methodology_trace_policies.md +121 -0
  83. package/docs/schema/generated/methodology_trace_policies.svg +27 -0
  84. package/docs/schema/generated/schema.json +4253 -0
  85. package/docs/schema/generated/schema.mmd +296 -0
  86. package/docs/schema/generated/schema.svg +446 -0
  87. package/docs/schema/migrations.md +24 -0
  88. package/docs/usage.md +39 -0
  89. package/package.json +29 -0
  90. package/src/database/migrations/0001_methodology_base.sql +1190 -0
@@ -0,0 +1,4253 @@
1
+ {
2
+ "name": "agentic-domain-methodology",
3
+ "desc": "Agentic Platform methodology domain database.",
4
+ "tables": [
5
+ {
6
+ "name": "methodology_schema_migrations",
7
+ "type": "table",
8
+ "comment": "methodology 패키지의 migration 적용 이력을 관리한다.",
9
+ "columns": [
10
+ {
11
+ "name": "migration_id",
12
+ "type": "VARCHAR(128)",
13
+ "nullable": true
14
+ },
15
+ {
16
+ "name": "migration_name",
17
+ "type": "VARCHAR(256)",
18
+ "nullable": false
19
+ },
20
+ {
21
+ "name": "applied_at",
22
+ "type": "DATETIME",
23
+ "nullable": false,
24
+ "default": "CURRENT_TIMESTAMP"
25
+ }
26
+ ],
27
+ "indexes": [
28
+ {
29
+ "name": "sqlite_autoindex_methodology_schema_migrations_1",
30
+ "def": "PRIMARY KEY (migration_id)",
31
+ "table": "methodology_schema_migrations",
32
+ "columns": [
33
+ "migration_id"
34
+ ]
35
+ }
36
+ ],
37
+ "constraints": [
38
+ {
39
+ "name": "migration_id",
40
+ "type": "PRIMARY KEY",
41
+ "def": "PRIMARY KEY (migration_id)",
42
+ "table": "methodology_schema_migrations",
43
+ "columns": [
44
+ "migration_id"
45
+ ]
46
+ },
47
+ {
48
+ "name": "sqlite_autoindex_methodology_schema_migrations_1",
49
+ "type": "PRIMARY KEY",
50
+ "def": "PRIMARY KEY (migration_id)",
51
+ "table": "methodology_schema_migrations",
52
+ "columns": [
53
+ "migration_id"
54
+ ]
55
+ }
56
+ ],
57
+ "def": "CREATE TABLE methodology_schema_migrations (\n -- migration 식별자\n migration_id VARCHAR(128) PRIMARY KEY,\n\n -- migration 이름\n migration_name VARCHAR(256) NOT NULL,\n\n -- 적용 시각\n applied_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP\n)"
58
+ },
59
+ {
60
+ "name": "methodology_code_groups",
61
+ "type": "table",
62
+ "comment": "코드 그룹을 정의한다.",
63
+ "columns": [
64
+ {
65
+ "name": "code_group_code",
66
+ "type": "VARCHAR(64)",
67
+ "nullable": true
68
+ },
69
+ {
70
+ "name": "code_group_name",
71
+ "type": "VARCHAR(128)",
72
+ "nullable": false
73
+ },
74
+ {
75
+ "name": "description",
76
+ "type": "TEXT",
77
+ "nullable": true
78
+ },
79
+ {
80
+ "name": "sort_order",
81
+ "type": "INTEGER",
82
+ "nullable": false,
83
+ "default": "0"
84
+ },
85
+ {
86
+ "name": "is_active",
87
+ "type": "INTEGER",
88
+ "nullable": false,
89
+ "default": "1"
90
+ },
91
+ {
92
+ "name": "created_at",
93
+ "type": "DATETIME",
94
+ "nullable": false,
95
+ "default": "CURRENT_TIMESTAMP"
96
+ },
97
+ {
98
+ "name": "updated_at",
99
+ "type": "DATETIME",
100
+ "nullable": false,
101
+ "default": "CURRENT_TIMESTAMP"
102
+ }
103
+ ],
104
+ "indexes": [
105
+ {
106
+ "name": "sqlite_autoindex_methodology_code_groups_1",
107
+ "def": "PRIMARY KEY (code_group_code)",
108
+ "table": "methodology_code_groups",
109
+ "columns": [
110
+ "code_group_code"
111
+ ]
112
+ }
113
+ ],
114
+ "constraints": [
115
+ {
116
+ "name": "code_group_code",
117
+ "type": "PRIMARY KEY",
118
+ "def": "PRIMARY KEY (code_group_code)",
119
+ "table": "methodology_code_groups",
120
+ "columns": [
121
+ "code_group_code"
122
+ ]
123
+ },
124
+ {
125
+ "name": "sqlite_autoindex_methodology_code_groups_1",
126
+ "type": "PRIMARY KEY",
127
+ "def": "PRIMARY KEY (code_group_code)",
128
+ "table": "methodology_code_groups",
129
+ "columns": [
130
+ "code_group_code"
131
+ ]
132
+ },
133
+ {
134
+ "name": "-",
135
+ "type": "CHECK",
136
+ "def": "CHECK (is_active IN (0, 1))",
137
+ "table": "methodology_code_groups",
138
+ "columns": [
139
+ "is_active"
140
+ ]
141
+ }
142
+ ],
143
+ "def": "CREATE TABLE methodology_code_groups (\n -- 코드 그룹 식별자\n code_group_code VARCHAR(64) PRIMARY KEY,\n\n -- 코드 그룹 한글명\n code_group_name VARCHAR(128) NOT NULL,\n\n -- 코드 그룹 설명\n description TEXT,\n\n -- 표시 정렬 순서\n sort_order INTEGER NOT NULL DEFAULT 0,\n\n -- 활성 여부. 1은 활성, 0은 비활성\n is_active INTEGER NOT NULL DEFAULT 1\n CHECK (is_active IN (0, 1)),\n\n -- 생성 시각\n created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 수정 시각\n updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP\n)"
144
+ },
145
+ {
146
+ "name": "methodology_codes",
147
+ "type": "table",
148
+ "comment": "코드 그룹별 코드 값을 정의한다.",
149
+ "columns": [
150
+ {
151
+ "name": "code_group_code",
152
+ "type": "VARCHAR(64)",
153
+ "nullable": false
154
+ },
155
+ {
156
+ "name": "code",
157
+ "type": "VARCHAR(128)",
158
+ "nullable": false
159
+ },
160
+ {
161
+ "name": "code_name",
162
+ "type": "VARCHAR(128)",
163
+ "nullable": false
164
+ },
165
+ {
166
+ "name": "description",
167
+ "type": "TEXT",
168
+ "nullable": true
169
+ },
170
+ {
171
+ "name": "sort_order",
172
+ "type": "INTEGER",
173
+ "nullable": false,
174
+ "default": "0"
175
+ },
176
+ {
177
+ "name": "is_active",
178
+ "type": "INTEGER",
179
+ "nullable": false,
180
+ "default": "1"
181
+ },
182
+ {
183
+ "name": "metadata_json",
184
+ "type": "JSON",
185
+ "nullable": true
186
+ },
187
+ {
188
+ "name": "created_at",
189
+ "type": "DATETIME",
190
+ "nullable": false,
191
+ "default": "CURRENT_TIMESTAMP"
192
+ },
193
+ {
194
+ "name": "updated_at",
195
+ "type": "DATETIME",
196
+ "nullable": false,
197
+ "default": "CURRENT_TIMESTAMP"
198
+ }
199
+ ],
200
+ "indexes": [
201
+ {
202
+ "name": "sqlite_autoindex_methodology_codes_1",
203
+ "def": "PRIMARY KEY (code_group_code, code)",
204
+ "table": "methodology_codes",
205
+ "columns": [
206
+ "code_group_code",
207
+ "code"
208
+ ]
209
+ }
210
+ ],
211
+ "constraints": [
212
+ {
213
+ "name": "code_group_code",
214
+ "type": "PRIMARY KEY",
215
+ "def": "PRIMARY KEY (code_group_code)",
216
+ "table": "methodology_codes",
217
+ "columns": [
218
+ "code_group_code"
219
+ ]
220
+ },
221
+ {
222
+ "name": "code",
223
+ "type": "PRIMARY KEY",
224
+ "def": "PRIMARY KEY (code)",
225
+ "table": "methodology_codes",
226
+ "columns": [
227
+ "code"
228
+ ]
229
+ },
230
+ {
231
+ "name": "- (Foreign key ID: 0)",
232
+ "type": "FOREIGN KEY",
233
+ "def": "FOREIGN KEY (code_group_code) REFERENCES methodology_code_groups (code_group_code) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE",
234
+ "table": "methodology_codes",
235
+ "referenced_table": "methodology_code_groups",
236
+ "columns": [
237
+ "code_group_code"
238
+ ],
239
+ "referenced_columns": [
240
+ "code_group_code"
241
+ ]
242
+ },
243
+ {
244
+ "name": "sqlite_autoindex_methodology_codes_1",
245
+ "type": "PRIMARY KEY",
246
+ "def": "PRIMARY KEY (code_group_code, code)",
247
+ "table": "methodology_codes",
248
+ "columns": [
249
+ "code_group_code",
250
+ "code"
251
+ ]
252
+ },
253
+ {
254
+ "name": "-",
255
+ "type": "CHECK",
256
+ "def": "CHECK (is_active IN (0, 1))",
257
+ "table": "methodology_codes",
258
+ "columns": [
259
+ "is_active"
260
+ ]
261
+ },
262
+ {
263
+ "name": "-",
264
+ "type": "CHECK",
265
+ "def": "CHECK (metadata_json IS NULL OR json_valid(metadata_json))",
266
+ "table": "methodology_codes",
267
+ "columns": [
268
+ "metadata_json"
269
+ ]
270
+ }
271
+ ],
272
+ "def": "CREATE TABLE methodology_codes (\n -- 코드 그룹 식별자\n code_group_code VARCHAR(64) NOT NULL,\n\n -- 코드 값. lower_snake_case를 사용한다.\n code VARCHAR(128) NOT NULL,\n\n -- 코드 한글명\n code_name VARCHAR(128) NOT NULL,\n\n -- 코드 설명\n description TEXT,\n\n -- 표시 정렬 순서\n sort_order INTEGER NOT NULL DEFAULT 0,\n\n -- 활성 여부. 1은 활성, 0은 비활성\n is_active INTEGER NOT NULL DEFAULT 1\n CHECK (is_active IN (0, 1)),\n\n -- 확장 메타데이터\n metadata_json JSON\n CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n\n -- 생성 시각\n created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 수정 시각\n updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n PRIMARY KEY (code_group_code, code),\n\n FOREIGN KEY (code_group_code)\n REFERENCES methodology_code_groups (code_group_code)\n ON DELETE CASCADE\n)"
273
+ },
274
+ {
275
+ "name": "methodology_methodologies",
276
+ "type": "table",
277
+ "comment": "방법론 정의의 최상위 versioned definition을 관리한다.",
278
+ "columns": [
279
+ {
280
+ "name": "methodology_id",
281
+ "type": "CHAR(36)",
282
+ "nullable": true
283
+ },
284
+ {
285
+ "name": "methodology_code",
286
+ "type": "VARCHAR(128)",
287
+ "nullable": false
288
+ },
289
+ {
290
+ "name": "methodology_name",
291
+ "type": "VARCHAR(256)",
292
+ "nullable": false
293
+ },
294
+ {
295
+ "name": "methodology_version",
296
+ "type": "VARCHAR(64)",
297
+ "nullable": false
298
+ },
299
+ {
300
+ "name": "methodology_status_code",
301
+ "type": "VARCHAR(32)",
302
+ "nullable": false,
303
+ "default": "'draft'"
304
+ },
305
+ {
306
+ "name": "description",
307
+ "type": "TEXT",
308
+ "nullable": true
309
+ },
310
+ {
311
+ "name": "is_active",
312
+ "type": "INTEGER",
313
+ "nullable": false,
314
+ "default": "1"
315
+ },
316
+ {
317
+ "name": "created_at",
318
+ "type": "DATETIME",
319
+ "nullable": false,
320
+ "default": "CURRENT_TIMESTAMP"
321
+ },
322
+ {
323
+ "name": "updated_at",
324
+ "type": "DATETIME",
325
+ "nullable": false,
326
+ "default": "CURRENT_TIMESTAMP"
327
+ },
328
+ {
329
+ "name": "metadata_json",
330
+ "type": "JSON",
331
+ "nullable": true
332
+ }
333
+ ],
334
+ "indexes": [
335
+ {
336
+ "name": "sqlite_autoindex_methodology_methodologies_2",
337
+ "def": "UNIQUE (methodology_code, methodology_version)",
338
+ "table": "methodology_methodologies",
339
+ "columns": [
340
+ "methodology_code",
341
+ "methodology_version"
342
+ ]
343
+ },
344
+ {
345
+ "name": "sqlite_autoindex_methodology_methodologies_1",
346
+ "def": "PRIMARY KEY (methodology_id)",
347
+ "table": "methodology_methodologies",
348
+ "columns": [
349
+ "methodology_id"
350
+ ]
351
+ }
352
+ ],
353
+ "constraints": [
354
+ {
355
+ "name": "methodology_id",
356
+ "type": "PRIMARY KEY",
357
+ "def": "PRIMARY KEY (methodology_id)",
358
+ "table": "methodology_methodologies",
359
+ "columns": [
360
+ "methodology_id"
361
+ ]
362
+ },
363
+ {
364
+ "name": "sqlite_autoindex_methodology_methodologies_2",
365
+ "type": "UNIQUE",
366
+ "def": "UNIQUE (methodology_code, methodology_version)",
367
+ "table": "methodology_methodologies",
368
+ "columns": [
369
+ "methodology_code",
370
+ "methodology_version"
371
+ ]
372
+ },
373
+ {
374
+ "name": "sqlite_autoindex_methodology_methodologies_1",
375
+ "type": "PRIMARY KEY",
376
+ "def": "PRIMARY KEY (methodology_id)",
377
+ "table": "methodology_methodologies",
378
+ "columns": [
379
+ "methodology_id"
380
+ ]
381
+ },
382
+ {
383
+ "name": "-",
384
+ "type": "CHECK",
385
+ "def": "CHECK (length(methodology_id) = 36)",
386
+ "table": "methodology_methodologies",
387
+ "columns": [
388
+ "methodology_id"
389
+ ]
390
+ },
391
+ {
392
+ "name": "-",
393
+ "type": "CHECK",
394
+ "def": "CHECK (methodology_status_code IN ('draft', 'active', 'deprecated', 'archived'))",
395
+ "table": "methodology_methodologies",
396
+ "columns": [
397
+ "methodology_status_code"
398
+ ]
399
+ },
400
+ {
401
+ "name": "-",
402
+ "type": "CHECK",
403
+ "def": "CHECK (is_active IN (0, 1))",
404
+ "table": "methodology_methodologies",
405
+ "columns": [
406
+ "is_active"
407
+ ]
408
+ },
409
+ {
410
+ "name": "-",
411
+ "type": "CHECK",
412
+ "def": "CHECK (metadata_json IS NULL OR json_valid(metadata_json))",
413
+ "table": "methodology_methodologies",
414
+ "columns": [
415
+ "metadata_json"
416
+ ]
417
+ }
418
+ ],
419
+ "def": "CREATE TABLE methodology_methodologies (\n -- 방법론 식별자\n methodology_id CHAR(36) PRIMARY KEY\n CHECK (length(methodology_id) = 36),\n\n -- 방법론 코드\n methodology_code VARCHAR(128) NOT NULL,\n\n -- 방법론명\n methodology_name VARCHAR(256) NOT NULL,\n\n -- 방법론 정의 데이터 버전\n methodology_version VARCHAR(64) NOT NULL,\n\n -- 방법론 상태 코드\n methodology_status_code VARCHAR(32) NOT NULL DEFAULT 'draft'\n CHECK (methodology_status_code IN ('draft', 'active', 'deprecated', 'archived')),\n\n -- 방법론 설명\n description TEXT,\n\n -- 활성 여부. 1은 활성, 0은 비활성\n is_active INTEGER NOT NULL DEFAULT 1\n CHECK (is_active IN (0, 1)),\n\n -- 생성 시각\n created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 수정 시각\n updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 확장 메타데이터\n metadata_json JSON\n CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n\n UNIQUE (methodology_code, methodology_version)\n)"
420
+ },
421
+ {
422
+ "name": "methodology_common_blueprint_policies",
423
+ "type": "table",
424
+ "columns": [
425
+ {
426
+ "name": "common_blueprint_policy_id",
427
+ "type": "CHAR(36)",
428
+ "nullable": true
429
+ },
430
+ {
431
+ "name": "methodology_id",
432
+ "type": "CHAR(36)",
433
+ "nullable": false
434
+ },
435
+ {
436
+ "name": "policy_code",
437
+ "type": "VARCHAR(128)",
438
+ "nullable": false
439
+ },
440
+ {
441
+ "name": "policy_name",
442
+ "type": "VARCHAR(256)",
443
+ "nullable": false
444
+ },
445
+ {
446
+ "name": "applies_to_standard_type_code",
447
+ "type": "VARCHAR(64)",
448
+ "nullable": true
449
+ },
450
+ {
451
+ "name": "is_default",
452
+ "type": "INTEGER",
453
+ "nullable": false,
454
+ "default": "0"
455
+ },
456
+ {
457
+ "name": "status_code",
458
+ "type": "VARCHAR(32)",
459
+ "nullable": false,
460
+ "default": "'DRAFT'"
461
+ },
462
+ {
463
+ "name": "is_active",
464
+ "type": "INTEGER",
465
+ "nullable": false,
466
+ "default": "1"
467
+ },
468
+ {
469
+ "name": "created_at",
470
+ "type": "DATETIME",
471
+ "nullable": false,
472
+ "default": "CURRENT_TIMESTAMP"
473
+ },
474
+ {
475
+ "name": "updated_at",
476
+ "type": "DATETIME",
477
+ "nullable": false,
478
+ "default": "CURRENT_TIMESTAMP"
479
+ },
480
+ {
481
+ "name": "metadata_json",
482
+ "type": "JSON",
483
+ "nullable": true
484
+ }
485
+ ],
486
+ "indexes": [
487
+ {
488
+ "name": "ux_methodology_common_blueprint_policies_default",
489
+ "def": "CREATE UNIQUE INDEX ux_methodology_common_blueprint_policies_default\n ON methodology_common_blueprint_policies (methodology_id)\n WHERE is_default = 1",
490
+ "table": "methodology_common_blueprint_policies",
491
+ "columns": [
492
+ "methodology_id"
493
+ ]
494
+ },
495
+ {
496
+ "name": "sqlite_autoindex_methodology_common_blueprint_policies_2",
497
+ "def": "UNIQUE (methodology_id, policy_code)",
498
+ "table": "methodology_common_blueprint_policies",
499
+ "columns": [
500
+ "methodology_id",
501
+ "policy_code"
502
+ ]
503
+ },
504
+ {
505
+ "name": "sqlite_autoindex_methodology_common_blueprint_policies_1",
506
+ "def": "PRIMARY KEY (common_blueprint_policy_id)",
507
+ "table": "methodology_common_blueprint_policies",
508
+ "columns": [
509
+ "common_blueprint_policy_id"
510
+ ]
511
+ }
512
+ ],
513
+ "constraints": [
514
+ {
515
+ "name": "common_blueprint_policy_id",
516
+ "type": "PRIMARY KEY",
517
+ "def": "PRIMARY KEY (common_blueprint_policy_id)",
518
+ "table": "methodology_common_blueprint_policies",
519
+ "columns": [
520
+ "common_blueprint_policy_id"
521
+ ]
522
+ },
523
+ {
524
+ "name": "- (Foreign key ID: 0)",
525
+ "type": "FOREIGN KEY",
526
+ "def": "FOREIGN KEY (methodology_id) REFERENCES methodology_methodologies (methodology_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE",
527
+ "table": "methodology_common_blueprint_policies",
528
+ "referenced_table": "methodology_methodologies",
529
+ "columns": [
530
+ "methodology_id"
531
+ ],
532
+ "referenced_columns": [
533
+ "methodology_id"
534
+ ]
535
+ },
536
+ {
537
+ "name": "sqlite_autoindex_methodology_common_blueprint_policies_2",
538
+ "type": "UNIQUE",
539
+ "def": "UNIQUE (methodology_id, policy_code)",
540
+ "table": "methodology_common_blueprint_policies",
541
+ "columns": [
542
+ "methodology_id",
543
+ "policy_code"
544
+ ]
545
+ },
546
+ {
547
+ "name": "sqlite_autoindex_methodology_common_blueprint_policies_1",
548
+ "type": "PRIMARY KEY",
549
+ "def": "PRIMARY KEY (common_blueprint_policy_id)",
550
+ "table": "methodology_common_blueprint_policies",
551
+ "columns": [
552
+ "common_blueprint_policy_id"
553
+ ]
554
+ },
555
+ {
556
+ "name": "-",
557
+ "type": "CHECK",
558
+ "def": "CHECK (length(common_blueprint_policy_id) = 36)",
559
+ "table": "methodology_common_blueprint_policies",
560
+ "columns": [
561
+ "common_blueprint_policy_id"
562
+ ]
563
+ },
564
+ {
565
+ "name": "-",
566
+ "type": "CHECK",
567
+ "def": "CHECK (length(methodology_id) = 36)",
568
+ "table": "methodology_common_blueprint_policies",
569
+ "columns": [
570
+ "methodology_id"
571
+ ]
572
+ },
573
+ {
574
+ "name": "-",
575
+ "type": "CHECK",
576
+ "def": "CHECK (is_default IN (0, 1))",
577
+ "table": "methodology_common_blueprint_policies",
578
+ "columns": [
579
+ "is_default"
580
+ ]
581
+ },
582
+ {
583
+ "name": "-",
584
+ "type": "CHECK",
585
+ "def": "CHECK (status_code IN ('DRAFT', 'ACTIVE', 'DEPRECATED', 'ARCHIVED'))",
586
+ "table": "methodology_common_blueprint_policies",
587
+ "columns": [
588
+ "status_code"
589
+ ]
590
+ },
591
+ {
592
+ "name": "-",
593
+ "type": "CHECK",
594
+ "def": "CHECK (is_active IN (0, 1))",
595
+ "table": "methodology_common_blueprint_policies",
596
+ "columns": [
597
+ "is_active"
598
+ ]
599
+ },
600
+ {
601
+ "name": "-",
602
+ "type": "CHECK",
603
+ "def": "CHECK (metadata_json IS NULL OR json_valid(metadata_json))",
604
+ "table": "methodology_common_blueprint_policies",
605
+ "columns": [
606
+ "metadata_json"
607
+ ]
608
+ }
609
+ ],
610
+ "def": "CREATE TABLE methodology_common_blueprint_policies (\n -- common blueprint policy 식별자\n common_blueprint_policy_id CHAR(36) PRIMARY KEY\n CHECK (length(common_blueprint_policy_id) = 36),\n\n -- 소속 방법론 식별자\n methodology_id CHAR(36) NOT NULL\n CHECK (length(methodology_id) = 36),\n\n -- policy 코드\n policy_code VARCHAR(128) NOT NULL,\n\n -- policy 이름\n policy_name VARCHAR(256) NOT NULL,\n\n -- 적용 대상 Artifact Standard 유형 코드. NULL이면 방법론 기본 공통 정책이다.\n applies_to_standard_type_code VARCHAR(64),\n\n -- 기본 policy 여부\n is_default INTEGER NOT NULL DEFAULT 0\n CHECK (is_default IN (0, 1)),\n\n -- policy 상태 코드\n status_code VARCHAR(32) NOT NULL DEFAULT 'DRAFT'\n CHECK (status_code IN ('DRAFT', 'ACTIVE', 'DEPRECATED', 'ARCHIVED')),\n\n -- 활성 여부\n is_active INTEGER NOT NULL DEFAULT 1\n CHECK (is_active IN (0, 1)),\n\n -- 생성 시각\n created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 수정 시각\n updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 확장 메타데이터\n metadata_json JSON\n CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n\n FOREIGN KEY (methodology_id)\n REFERENCES methodology_methodologies (methodology_id)\n ON DELETE CASCADE,\n\n UNIQUE (methodology_id, policy_code)\n)"
611
+ },
612
+ {
613
+ "name": "methodology_common_blueprint_policy_nodes",
614
+ "type": "table",
615
+ "columns": [
616
+ {
617
+ "name": "common_blueprint_policy_node_id",
618
+ "type": "CHAR(36)",
619
+ "nullable": true
620
+ },
621
+ {
622
+ "name": "common_blueprint_policy_id",
623
+ "type": "CHAR(36)",
624
+ "nullable": false
625
+ },
626
+ {
627
+ "name": "parent_policy_node_id",
628
+ "type": "CHAR(36)",
629
+ "nullable": true
630
+ },
631
+ {
632
+ "name": "node_code",
633
+ "type": "VARCHAR(128)",
634
+ "nullable": false
635
+ },
636
+ {
637
+ "name": "node_title",
638
+ "type": "VARCHAR(256)",
639
+ "nullable": false
640
+ },
641
+ {
642
+ "name": "node_type_code",
643
+ "type": "VARCHAR(32)",
644
+ "nullable": false
645
+ },
646
+ {
647
+ "name": "node_level",
648
+ "type": "INTEGER",
649
+ "nullable": false
650
+ },
651
+ {
652
+ "name": "is_required",
653
+ "type": "INTEGER",
654
+ "nullable": false,
655
+ "default": "0"
656
+ },
657
+ {
658
+ "name": "sort_order",
659
+ "type": "INTEGER",
660
+ "nullable": false,
661
+ "default": "0"
662
+ },
663
+ {
664
+ "name": "created_at",
665
+ "type": "DATETIME",
666
+ "nullable": false,
667
+ "default": "CURRENT_TIMESTAMP"
668
+ },
669
+ {
670
+ "name": "updated_at",
671
+ "type": "DATETIME",
672
+ "nullable": false,
673
+ "default": "CURRENT_TIMESTAMP"
674
+ },
675
+ {
676
+ "name": "metadata_json",
677
+ "type": "JSON",
678
+ "nullable": true
679
+ }
680
+ ],
681
+ "indexes": [
682
+ {
683
+ "name": "idx_methodology_common_blueprint_policy_nodes_policy_type",
684
+ "def": "CREATE INDEX idx_methodology_common_blueprint_policy_nodes_policy_type\n ON methodology_common_blueprint_policy_nodes (common_blueprint_policy_id, node_type_code, sort_order)",
685
+ "table": "methodology_common_blueprint_policy_nodes",
686
+ "columns": [
687
+ "common_blueprint_policy_id",
688
+ "node_type_code",
689
+ "sort_order"
690
+ ]
691
+ },
692
+ {
693
+ "name": "sqlite_autoindex_methodology_common_blueprint_policy_nodes_3",
694
+ "def": "UNIQUE (common_blueprint_policy_id, parent_policy_node_id, sort_order)",
695
+ "table": "methodology_common_blueprint_policy_nodes",
696
+ "columns": [
697
+ "common_blueprint_policy_id",
698
+ "parent_policy_node_id",
699
+ "sort_order"
700
+ ]
701
+ },
702
+ {
703
+ "name": "sqlite_autoindex_methodology_common_blueprint_policy_nodes_2",
704
+ "def": "UNIQUE (common_blueprint_policy_id, node_code)",
705
+ "table": "methodology_common_blueprint_policy_nodes",
706
+ "columns": [
707
+ "common_blueprint_policy_id",
708
+ "node_code"
709
+ ]
710
+ },
711
+ {
712
+ "name": "sqlite_autoindex_methodology_common_blueprint_policy_nodes_1",
713
+ "def": "PRIMARY KEY (common_blueprint_policy_node_id)",
714
+ "table": "methodology_common_blueprint_policy_nodes",
715
+ "columns": [
716
+ "common_blueprint_policy_node_id"
717
+ ]
718
+ }
719
+ ],
720
+ "constraints": [
721
+ {
722
+ "name": "common_blueprint_policy_node_id",
723
+ "type": "PRIMARY KEY",
724
+ "def": "PRIMARY KEY (common_blueprint_policy_node_id)",
725
+ "table": "methodology_common_blueprint_policy_nodes",
726
+ "columns": [
727
+ "common_blueprint_policy_node_id"
728
+ ]
729
+ },
730
+ {
731
+ "name": "- (Foreign key ID: 0)",
732
+ "type": "FOREIGN KEY",
733
+ "def": "FOREIGN KEY (parent_policy_node_id) REFERENCES methodology_common_blueprint_policy_nodes (common_blueprint_policy_node_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE",
734
+ "table": "methodology_common_blueprint_policy_nodes",
735
+ "referenced_table": "methodology_common_blueprint_policy_nodes",
736
+ "columns": [
737
+ "parent_policy_node_id"
738
+ ],
739
+ "referenced_columns": [
740
+ "common_blueprint_policy_node_id"
741
+ ]
742
+ },
743
+ {
744
+ "name": "- (Foreign key ID: 1)",
745
+ "type": "FOREIGN KEY",
746
+ "def": "FOREIGN KEY (common_blueprint_policy_id) REFERENCES methodology_common_blueprint_policies (common_blueprint_policy_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE",
747
+ "table": "methodology_common_blueprint_policy_nodes",
748
+ "referenced_table": "methodology_common_blueprint_policies",
749
+ "columns": [
750
+ "common_blueprint_policy_id"
751
+ ],
752
+ "referenced_columns": [
753
+ "common_blueprint_policy_id"
754
+ ]
755
+ },
756
+ {
757
+ "name": "sqlite_autoindex_methodology_common_blueprint_policy_nodes_3",
758
+ "type": "UNIQUE",
759
+ "def": "UNIQUE (common_blueprint_policy_id, parent_policy_node_id, sort_order)",
760
+ "table": "methodology_common_blueprint_policy_nodes",
761
+ "columns": [
762
+ "common_blueprint_policy_id",
763
+ "parent_policy_node_id",
764
+ "sort_order"
765
+ ]
766
+ },
767
+ {
768
+ "name": "sqlite_autoindex_methodology_common_blueprint_policy_nodes_2",
769
+ "type": "UNIQUE",
770
+ "def": "UNIQUE (common_blueprint_policy_id, node_code)",
771
+ "table": "methodology_common_blueprint_policy_nodes",
772
+ "columns": [
773
+ "common_blueprint_policy_id",
774
+ "node_code"
775
+ ]
776
+ },
777
+ {
778
+ "name": "sqlite_autoindex_methodology_common_blueprint_policy_nodes_1",
779
+ "type": "PRIMARY KEY",
780
+ "def": "PRIMARY KEY (common_blueprint_policy_node_id)",
781
+ "table": "methodology_common_blueprint_policy_nodes",
782
+ "columns": [
783
+ "common_blueprint_policy_node_id"
784
+ ]
785
+ },
786
+ {
787
+ "name": "-",
788
+ "type": "CHECK",
789
+ "def": "CHECK (length(common_blueprint_policy_node_id) = 36)",
790
+ "table": "methodology_common_blueprint_policy_nodes",
791
+ "columns": [
792
+ "common_blueprint_policy_node_id"
793
+ ]
794
+ },
795
+ {
796
+ "name": "-",
797
+ "type": "CHECK",
798
+ "def": "CHECK (length(common_blueprint_policy_id) = 36)",
799
+ "table": "methodology_common_blueprint_policy_nodes",
800
+ "columns": [
801
+ "common_blueprint_policy_id"
802
+ ]
803
+ },
804
+ {
805
+ "name": "-",
806
+ "type": "CHECK",
807
+ "def": "CHECK (parent_policy_node_id IS NULL OR length(parent_policy_node_id) = 36)",
808
+ "table": "methodology_common_blueprint_policy_nodes",
809
+ "columns": [
810
+ "parent_policy_node_id"
811
+ ]
812
+ },
813
+ {
814
+ "name": "-",
815
+ "type": "CHECK",
816
+ "def": "CHECK (node_type_code IN ('FRONT_MATTER', 'BACK_MATTER', 'BODY_POLICY'))",
817
+ "table": "methodology_common_blueprint_policy_nodes",
818
+ "columns": [
819
+ "node_type_code"
820
+ ]
821
+ },
822
+ {
823
+ "name": "-",
824
+ "type": "CHECK",
825
+ "def": "CHECK (node_level BETWEEN 1 AND 7)",
826
+ "table": "methodology_common_blueprint_policy_nodes",
827
+ "columns": [
828
+ "node_level"
829
+ ]
830
+ },
831
+ {
832
+ "name": "-",
833
+ "type": "CHECK",
834
+ "def": "CHECK (is_required IN (0, 1))",
835
+ "table": "methodology_common_blueprint_policy_nodes",
836
+ "columns": [
837
+ "is_required"
838
+ ]
839
+ },
840
+ {
841
+ "name": "-",
842
+ "type": "CHECK",
843
+ "def": "CHECK (metadata_json IS NULL OR json_valid(metadata_json))",
844
+ "table": "methodology_common_blueprint_policy_nodes",
845
+ "columns": [
846
+ "metadata_json"
847
+ ]
848
+ }
849
+ ],
850
+ "def": "CREATE TABLE methodology_common_blueprint_policy_nodes (\n -- common blueprint policy node 식별자\n common_blueprint_policy_node_id CHAR(36) PRIMARY KEY\n CHECK (length(common_blueprint_policy_node_id) = 36),\n\n -- 소속 common blueprint policy 식별자\n common_blueprint_policy_id CHAR(36) NOT NULL\n CHECK (length(common_blueprint_policy_id) = 36),\n\n -- 상위 common blueprint policy node 식별자\n parent_policy_node_id CHAR(36)\n CHECK (parent_policy_node_id IS NULL OR length(parent_policy_node_id) = 36),\n\n -- node 코드\n node_code VARCHAR(128) NOT NULL,\n\n -- node 제목\n node_title VARCHAR(256) NOT NULL,\n\n -- node 유형 코드\n node_type_code VARCHAR(32) NOT NULL\n CHECK (node_type_code IN ('FRONT_MATTER', 'BACK_MATTER', 'BODY_POLICY')),\n\n -- node level\n node_level INTEGER NOT NULL\n CHECK (node_level BETWEEN 1 AND 7),\n\n -- 필수 여부\n is_required INTEGER NOT NULL DEFAULT 0\n CHECK (is_required IN (0, 1)),\n\n -- 정렬 순서\n sort_order INTEGER NOT NULL DEFAULT 0,\n\n -- 생성 시각\n created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 수정 시각\n updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 확장 메타데이터\n metadata_json JSON\n CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n\n FOREIGN KEY (common_blueprint_policy_id)\n REFERENCES methodology_common_blueprint_policies (common_blueprint_policy_id)\n ON DELETE CASCADE,\n\n FOREIGN KEY (parent_policy_node_id)\n REFERENCES methodology_common_blueprint_policy_nodes (common_blueprint_policy_node_id)\n ON DELETE CASCADE,\n\n UNIQUE (common_blueprint_policy_id, node_code),\n UNIQUE (common_blueprint_policy_id, parent_policy_node_id, sort_order)\n)"
851
+ },
852
+ {
853
+ "name": "methodology_lifecycles",
854
+ "type": "table",
855
+ "comment": "방법론 생명주기 모델을 관리한다.",
856
+ "columns": [
857
+ {
858
+ "name": "lifecycle_id",
859
+ "type": "CHAR(36)",
860
+ "nullable": true
861
+ },
862
+ {
863
+ "name": "methodology_id",
864
+ "type": "CHAR(36)",
865
+ "nullable": false
866
+ },
867
+ {
868
+ "name": "lifecycle_code",
869
+ "type": "VARCHAR(128)",
870
+ "nullable": false
871
+ },
872
+ {
873
+ "name": "lifecycle_name",
874
+ "type": "VARCHAR(256)",
875
+ "nullable": false
876
+ },
877
+ {
878
+ "name": "lifecycle_type_code",
879
+ "type": "VARCHAR(64)",
880
+ "nullable": false,
881
+ "default": "'default'"
882
+ },
883
+ {
884
+ "name": "description",
885
+ "type": "TEXT",
886
+ "nullable": true
887
+ },
888
+ {
889
+ "name": "sort_order",
890
+ "type": "INTEGER",
891
+ "nullable": false,
892
+ "default": "0"
893
+ },
894
+ {
895
+ "name": "is_active",
896
+ "type": "INTEGER",
897
+ "nullable": false,
898
+ "default": "1"
899
+ },
900
+ {
901
+ "name": "created_at",
902
+ "type": "DATETIME",
903
+ "nullable": false,
904
+ "default": "CURRENT_TIMESTAMP"
905
+ },
906
+ {
907
+ "name": "updated_at",
908
+ "type": "DATETIME",
909
+ "nullable": false,
910
+ "default": "CURRENT_TIMESTAMP"
911
+ },
912
+ {
913
+ "name": "metadata_json",
914
+ "type": "JSON",
915
+ "nullable": true
916
+ }
917
+ ],
918
+ "indexes": [
919
+ {
920
+ "name": "idx_methodology_lifecycles_methodology",
921
+ "def": "CREATE INDEX idx_methodology_lifecycles_methodology\n ON methodology_lifecycles (methodology_id)",
922
+ "table": "methodology_lifecycles",
923
+ "columns": [
924
+ "methodology_id"
925
+ ]
926
+ },
927
+ {
928
+ "name": "sqlite_autoindex_methodology_lifecycles_3",
929
+ "def": "UNIQUE (methodology_id, sort_order)",
930
+ "table": "methodology_lifecycles",
931
+ "columns": [
932
+ "methodology_id",
933
+ "sort_order"
934
+ ]
935
+ },
936
+ {
937
+ "name": "sqlite_autoindex_methodology_lifecycles_2",
938
+ "def": "UNIQUE (methodology_id, lifecycle_code)",
939
+ "table": "methodology_lifecycles",
940
+ "columns": [
941
+ "methodology_id",
942
+ "lifecycle_code"
943
+ ]
944
+ },
945
+ {
946
+ "name": "sqlite_autoindex_methodology_lifecycles_1",
947
+ "def": "PRIMARY KEY (lifecycle_id)",
948
+ "table": "methodology_lifecycles",
949
+ "columns": [
950
+ "lifecycle_id"
951
+ ]
952
+ }
953
+ ],
954
+ "constraints": [
955
+ {
956
+ "name": "lifecycle_id",
957
+ "type": "PRIMARY KEY",
958
+ "def": "PRIMARY KEY (lifecycle_id)",
959
+ "table": "methodology_lifecycles",
960
+ "columns": [
961
+ "lifecycle_id"
962
+ ]
963
+ },
964
+ {
965
+ "name": "- (Foreign key ID: 0)",
966
+ "type": "FOREIGN KEY",
967
+ "def": "FOREIGN KEY (methodology_id) REFERENCES methodology_methodologies (methodology_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE",
968
+ "table": "methodology_lifecycles",
969
+ "referenced_table": "methodology_methodologies",
970
+ "columns": [
971
+ "methodology_id"
972
+ ],
973
+ "referenced_columns": [
974
+ "methodology_id"
975
+ ]
976
+ },
977
+ {
978
+ "name": "sqlite_autoindex_methodology_lifecycles_3",
979
+ "type": "UNIQUE",
980
+ "def": "UNIQUE (methodology_id, sort_order)",
981
+ "table": "methodology_lifecycles",
982
+ "columns": [
983
+ "methodology_id",
984
+ "sort_order"
985
+ ]
986
+ },
987
+ {
988
+ "name": "sqlite_autoindex_methodology_lifecycles_2",
989
+ "type": "UNIQUE",
990
+ "def": "UNIQUE (methodology_id, lifecycle_code)",
991
+ "table": "methodology_lifecycles",
992
+ "columns": [
993
+ "methodology_id",
994
+ "lifecycle_code"
995
+ ]
996
+ },
997
+ {
998
+ "name": "sqlite_autoindex_methodology_lifecycles_1",
999
+ "type": "PRIMARY KEY",
1000
+ "def": "PRIMARY KEY (lifecycle_id)",
1001
+ "table": "methodology_lifecycles",
1002
+ "columns": [
1003
+ "lifecycle_id"
1004
+ ]
1005
+ },
1006
+ {
1007
+ "name": "-",
1008
+ "type": "CHECK",
1009
+ "def": "CHECK (length(lifecycle_id) = 36)",
1010
+ "table": "methodology_lifecycles",
1011
+ "columns": [
1012
+ "lifecycle_id"
1013
+ ]
1014
+ },
1015
+ {
1016
+ "name": "-",
1017
+ "type": "CHECK",
1018
+ "def": "CHECK (length(methodology_id) = 36)",
1019
+ "table": "methodology_lifecycles",
1020
+ "columns": [
1021
+ "methodology_id"
1022
+ ]
1023
+ },
1024
+ {
1025
+ "name": "-",
1026
+ "type": "CHECK",
1027
+ "def": "CHECK (is_active IN (0, 1))",
1028
+ "table": "methodology_lifecycles",
1029
+ "columns": [
1030
+ "is_active"
1031
+ ]
1032
+ },
1033
+ {
1034
+ "name": "-",
1035
+ "type": "CHECK",
1036
+ "def": "CHECK (metadata_json IS NULL OR json_valid(metadata_json))",
1037
+ "table": "methodology_lifecycles",
1038
+ "columns": [
1039
+ "metadata_json"
1040
+ ]
1041
+ }
1042
+ ],
1043
+ "def": "CREATE TABLE methodology_lifecycles (\n -- lifecycle 식별자\n lifecycle_id CHAR(36) PRIMARY KEY\n CHECK (length(lifecycle_id) = 36),\n\n -- 소속 방법론 식별자\n methodology_id CHAR(36) NOT NULL\n CHECK (length(methodology_id) = 36),\n\n -- lifecycle 코드\n lifecycle_code VARCHAR(128) NOT NULL,\n\n -- lifecycle 이름\n lifecycle_name VARCHAR(256) NOT NULL,\n\n -- lifecycle 유형 코드\n lifecycle_type_code VARCHAR(64) NOT NULL DEFAULT 'default',\n\n -- 설명\n description TEXT,\n\n -- 표시 정렬 순서\n sort_order INTEGER NOT NULL DEFAULT 0,\n\n -- 활성 여부\n is_active INTEGER NOT NULL DEFAULT 1\n CHECK (is_active IN (0, 1)),\n\n -- 생성 시각\n created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 수정 시각\n updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 확장 메타데이터\n metadata_json JSON\n CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n\n FOREIGN KEY (methodology_id)\n REFERENCES methodology_methodologies (methodology_id)\n ON DELETE CASCADE,\n\n UNIQUE (methodology_id, lifecycle_code),\n UNIQUE (methodology_id, sort_order)\n)"
1044
+ },
1045
+ {
1046
+ "name": "methodology_phases",
1047
+ "type": "table",
1048
+ "comment": "lifecycle 내 큰 구간을 관리한다.",
1049
+ "columns": [
1050
+ {
1051
+ "name": "phase_id",
1052
+ "type": "CHAR(36)",
1053
+ "nullable": true
1054
+ },
1055
+ {
1056
+ "name": "lifecycle_id",
1057
+ "type": "CHAR(36)",
1058
+ "nullable": false
1059
+ },
1060
+ {
1061
+ "name": "phase_code",
1062
+ "type": "VARCHAR(128)",
1063
+ "nullable": false
1064
+ },
1065
+ {
1066
+ "name": "phase_name",
1067
+ "type": "VARCHAR(256)",
1068
+ "nullable": false
1069
+ },
1070
+ {
1071
+ "name": "phase_purpose",
1072
+ "type": "TEXT",
1073
+ "nullable": true
1074
+ },
1075
+ {
1076
+ "name": "sort_order",
1077
+ "type": "INTEGER",
1078
+ "nullable": false,
1079
+ "default": "0"
1080
+ },
1081
+ {
1082
+ "name": "is_required",
1083
+ "type": "INTEGER",
1084
+ "nullable": false,
1085
+ "default": "1"
1086
+ },
1087
+ {
1088
+ "name": "is_active",
1089
+ "type": "INTEGER",
1090
+ "nullable": false,
1091
+ "default": "1"
1092
+ },
1093
+ {
1094
+ "name": "created_at",
1095
+ "type": "DATETIME",
1096
+ "nullable": false,
1097
+ "default": "CURRENT_TIMESTAMP"
1098
+ },
1099
+ {
1100
+ "name": "updated_at",
1101
+ "type": "DATETIME",
1102
+ "nullable": false,
1103
+ "default": "CURRENT_TIMESTAMP"
1104
+ },
1105
+ {
1106
+ "name": "metadata_json",
1107
+ "type": "JSON",
1108
+ "nullable": true
1109
+ }
1110
+ ],
1111
+ "indexes": [
1112
+ {
1113
+ "name": "idx_methodology_phases_lifecycle_order",
1114
+ "def": "CREATE INDEX idx_methodology_phases_lifecycle_order\n ON methodology_phases (lifecycle_id, sort_order)",
1115
+ "table": "methodology_phases",
1116
+ "columns": [
1117
+ "lifecycle_id",
1118
+ "sort_order"
1119
+ ]
1120
+ },
1121
+ {
1122
+ "name": "sqlite_autoindex_methodology_phases_3",
1123
+ "def": "UNIQUE (lifecycle_id, sort_order)",
1124
+ "table": "methodology_phases",
1125
+ "columns": [
1126
+ "lifecycle_id",
1127
+ "sort_order"
1128
+ ]
1129
+ },
1130
+ {
1131
+ "name": "sqlite_autoindex_methodology_phases_2",
1132
+ "def": "UNIQUE (lifecycle_id, phase_code)",
1133
+ "table": "methodology_phases",
1134
+ "columns": [
1135
+ "lifecycle_id",
1136
+ "phase_code"
1137
+ ]
1138
+ },
1139
+ {
1140
+ "name": "sqlite_autoindex_methodology_phases_1",
1141
+ "def": "PRIMARY KEY (phase_id)",
1142
+ "table": "methodology_phases",
1143
+ "columns": [
1144
+ "phase_id"
1145
+ ]
1146
+ }
1147
+ ],
1148
+ "constraints": [
1149
+ {
1150
+ "name": "phase_id",
1151
+ "type": "PRIMARY KEY",
1152
+ "def": "PRIMARY KEY (phase_id)",
1153
+ "table": "methodology_phases",
1154
+ "columns": [
1155
+ "phase_id"
1156
+ ]
1157
+ },
1158
+ {
1159
+ "name": "- (Foreign key ID: 0)",
1160
+ "type": "FOREIGN KEY",
1161
+ "def": "FOREIGN KEY (lifecycle_id) REFERENCES methodology_lifecycles (lifecycle_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE",
1162
+ "table": "methodology_phases",
1163
+ "referenced_table": "methodology_lifecycles",
1164
+ "columns": [
1165
+ "lifecycle_id"
1166
+ ],
1167
+ "referenced_columns": [
1168
+ "lifecycle_id"
1169
+ ]
1170
+ },
1171
+ {
1172
+ "name": "sqlite_autoindex_methodology_phases_3",
1173
+ "type": "UNIQUE",
1174
+ "def": "UNIQUE (lifecycle_id, sort_order)",
1175
+ "table": "methodology_phases",
1176
+ "columns": [
1177
+ "lifecycle_id",
1178
+ "sort_order"
1179
+ ]
1180
+ },
1181
+ {
1182
+ "name": "sqlite_autoindex_methodology_phases_2",
1183
+ "type": "UNIQUE",
1184
+ "def": "UNIQUE (lifecycle_id, phase_code)",
1185
+ "table": "methodology_phases",
1186
+ "columns": [
1187
+ "lifecycle_id",
1188
+ "phase_code"
1189
+ ]
1190
+ },
1191
+ {
1192
+ "name": "sqlite_autoindex_methodology_phases_1",
1193
+ "type": "PRIMARY KEY",
1194
+ "def": "PRIMARY KEY (phase_id)",
1195
+ "table": "methodology_phases",
1196
+ "columns": [
1197
+ "phase_id"
1198
+ ]
1199
+ },
1200
+ {
1201
+ "name": "-",
1202
+ "type": "CHECK",
1203
+ "def": "CHECK (length(phase_id) = 36)",
1204
+ "table": "methodology_phases",
1205
+ "columns": [
1206
+ "phase_id"
1207
+ ]
1208
+ },
1209
+ {
1210
+ "name": "-",
1211
+ "type": "CHECK",
1212
+ "def": "CHECK (length(lifecycle_id) = 36)",
1213
+ "table": "methodology_phases",
1214
+ "columns": [
1215
+ "lifecycle_id"
1216
+ ]
1217
+ },
1218
+ {
1219
+ "name": "-",
1220
+ "type": "CHECK",
1221
+ "def": "CHECK (is_required IN (0, 1))",
1222
+ "table": "methodology_phases",
1223
+ "columns": [
1224
+ "is_required"
1225
+ ]
1226
+ },
1227
+ {
1228
+ "name": "-",
1229
+ "type": "CHECK",
1230
+ "def": "CHECK (is_active IN (0, 1))",
1231
+ "table": "methodology_phases",
1232
+ "columns": [
1233
+ "is_active"
1234
+ ]
1235
+ },
1236
+ {
1237
+ "name": "-",
1238
+ "type": "CHECK",
1239
+ "def": "CHECK (metadata_json IS NULL OR json_valid(metadata_json))",
1240
+ "table": "methodology_phases",
1241
+ "columns": [
1242
+ "metadata_json"
1243
+ ]
1244
+ }
1245
+ ],
1246
+ "def": "CREATE TABLE methodology_phases (\n -- phase 식별자\n phase_id CHAR(36) PRIMARY KEY\n CHECK (length(phase_id) = 36),\n\n -- 소속 lifecycle 식별자\n lifecycle_id CHAR(36) NOT NULL\n CHECK (length(lifecycle_id) = 36),\n\n -- phase 코드\n phase_code VARCHAR(128) NOT NULL,\n\n -- phase 이름\n phase_name VARCHAR(256) NOT NULL,\n\n -- phase 목적\n phase_purpose TEXT,\n\n -- 표시 정렬 순서\n sort_order INTEGER NOT NULL DEFAULT 0,\n\n -- 필수 여부\n is_required INTEGER NOT NULL DEFAULT 1\n CHECK (is_required IN (0, 1)),\n\n -- 활성 여부\n is_active INTEGER NOT NULL DEFAULT 1\n CHECK (is_active IN (0, 1)),\n\n -- 생성 시각\n created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 수정 시각\n updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 확장 메타데이터\n metadata_json JSON\n CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n\n FOREIGN KEY (lifecycle_id)\n REFERENCES methodology_lifecycles (lifecycle_id)\n ON DELETE CASCADE,\n\n UNIQUE (lifecycle_id, phase_code),\n UNIQUE (lifecycle_id, sort_order)\n)"
1247
+ },
1248
+ {
1249
+ "name": "methodology_processes",
1250
+ "type": "table",
1251
+ "comment": "재사용 가능한 수행 절차를 관리한다.",
1252
+ "columns": [
1253
+ {
1254
+ "name": "process_id",
1255
+ "type": "CHAR(36)",
1256
+ "nullable": true
1257
+ },
1258
+ {
1259
+ "name": "methodology_id",
1260
+ "type": "CHAR(36)",
1261
+ "nullable": false
1262
+ },
1263
+ {
1264
+ "name": "process_code",
1265
+ "type": "VARCHAR(128)",
1266
+ "nullable": false
1267
+ },
1268
+ {
1269
+ "name": "process_name",
1270
+ "type": "VARCHAR(256)",
1271
+ "nullable": false
1272
+ },
1273
+ {
1274
+ "name": "process_purpose",
1275
+ "type": "TEXT",
1276
+ "nullable": true
1277
+ },
1278
+ {
1279
+ "name": "process_type_code",
1280
+ "type": "VARCHAR(64)",
1281
+ "nullable": false,
1282
+ "default": "'default'"
1283
+ },
1284
+ {
1285
+ "name": "is_active",
1286
+ "type": "INTEGER",
1287
+ "nullable": false,
1288
+ "default": "1"
1289
+ },
1290
+ {
1291
+ "name": "created_at",
1292
+ "type": "DATETIME",
1293
+ "nullable": false,
1294
+ "default": "CURRENT_TIMESTAMP"
1295
+ },
1296
+ {
1297
+ "name": "updated_at",
1298
+ "type": "DATETIME",
1299
+ "nullable": false,
1300
+ "default": "CURRENT_TIMESTAMP"
1301
+ },
1302
+ {
1303
+ "name": "metadata_json",
1304
+ "type": "JSON",
1305
+ "nullable": true
1306
+ }
1307
+ ],
1308
+ "indexes": [
1309
+ {
1310
+ "name": "idx_methodology_processes_methodology",
1311
+ "def": "CREATE INDEX idx_methodology_processes_methodology\n ON methodology_processes (methodology_id)",
1312
+ "table": "methodology_processes",
1313
+ "columns": [
1314
+ "methodology_id"
1315
+ ]
1316
+ },
1317
+ {
1318
+ "name": "sqlite_autoindex_methodology_processes_2",
1319
+ "def": "UNIQUE (methodology_id, process_code)",
1320
+ "table": "methodology_processes",
1321
+ "columns": [
1322
+ "methodology_id",
1323
+ "process_code"
1324
+ ]
1325
+ },
1326
+ {
1327
+ "name": "sqlite_autoindex_methodology_processes_1",
1328
+ "def": "PRIMARY KEY (process_id)",
1329
+ "table": "methodology_processes",
1330
+ "columns": [
1331
+ "process_id"
1332
+ ]
1333
+ }
1334
+ ],
1335
+ "constraints": [
1336
+ {
1337
+ "name": "process_id",
1338
+ "type": "PRIMARY KEY",
1339
+ "def": "PRIMARY KEY (process_id)",
1340
+ "table": "methodology_processes",
1341
+ "columns": [
1342
+ "process_id"
1343
+ ]
1344
+ },
1345
+ {
1346
+ "name": "- (Foreign key ID: 0)",
1347
+ "type": "FOREIGN KEY",
1348
+ "def": "FOREIGN KEY (methodology_id) REFERENCES methodology_methodologies (methodology_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE",
1349
+ "table": "methodology_processes",
1350
+ "referenced_table": "methodology_methodologies",
1351
+ "columns": [
1352
+ "methodology_id"
1353
+ ],
1354
+ "referenced_columns": [
1355
+ "methodology_id"
1356
+ ]
1357
+ },
1358
+ {
1359
+ "name": "sqlite_autoindex_methodology_processes_2",
1360
+ "type": "UNIQUE",
1361
+ "def": "UNIQUE (methodology_id, process_code)",
1362
+ "table": "methodology_processes",
1363
+ "columns": [
1364
+ "methodology_id",
1365
+ "process_code"
1366
+ ]
1367
+ },
1368
+ {
1369
+ "name": "sqlite_autoindex_methodology_processes_1",
1370
+ "type": "PRIMARY KEY",
1371
+ "def": "PRIMARY KEY (process_id)",
1372
+ "table": "methodology_processes",
1373
+ "columns": [
1374
+ "process_id"
1375
+ ]
1376
+ },
1377
+ {
1378
+ "name": "-",
1379
+ "type": "CHECK",
1380
+ "def": "CHECK (length(process_id) = 36)",
1381
+ "table": "methodology_processes",
1382
+ "columns": [
1383
+ "process_id"
1384
+ ]
1385
+ },
1386
+ {
1387
+ "name": "-",
1388
+ "type": "CHECK",
1389
+ "def": "CHECK (length(methodology_id) = 36)",
1390
+ "table": "methodology_processes",
1391
+ "columns": [
1392
+ "methodology_id"
1393
+ ]
1394
+ },
1395
+ {
1396
+ "name": "-",
1397
+ "type": "CHECK",
1398
+ "def": "CHECK (is_active IN (0, 1))",
1399
+ "table": "methodology_processes",
1400
+ "columns": [
1401
+ "is_active"
1402
+ ]
1403
+ },
1404
+ {
1405
+ "name": "-",
1406
+ "type": "CHECK",
1407
+ "def": "CHECK (metadata_json IS NULL OR json_valid(metadata_json))",
1408
+ "table": "methodology_processes",
1409
+ "columns": [
1410
+ "metadata_json"
1411
+ ]
1412
+ }
1413
+ ],
1414
+ "def": "CREATE TABLE methodology_processes (\n -- process 식별자\n process_id CHAR(36) PRIMARY KEY\n CHECK (length(process_id) = 36),\n\n -- 소속 방법론 식별자\n methodology_id CHAR(36) NOT NULL\n CHECK (length(methodology_id) = 36),\n\n -- process 코드\n process_code VARCHAR(128) NOT NULL,\n\n -- process 이름\n process_name VARCHAR(256) NOT NULL,\n\n -- process 목적\n process_purpose TEXT,\n\n -- process 유형 코드\n process_type_code VARCHAR(64) NOT NULL DEFAULT 'default',\n\n -- 활성 여부\n is_active INTEGER NOT NULL DEFAULT 1\n CHECK (is_active IN (0, 1)),\n\n -- 생성 시각\n created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 수정 시각\n updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 확장 메타데이터\n metadata_json JSON\n CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n\n FOREIGN KEY (methodology_id)\n REFERENCES methodology_methodologies (methodology_id)\n ON DELETE CASCADE,\n\n UNIQUE (methodology_id, process_code)\n)"
1415
+ },
1416
+ {
1417
+ "name": "methodology_phase_processes",
1418
+ "type": "table",
1419
+ "comment": "phase에서 어떤 process를 어떤 순서로 사용할지 관리한다.",
1420
+ "columns": [
1421
+ {
1422
+ "name": "phase_process_id",
1423
+ "type": "CHAR(36)",
1424
+ "nullable": true
1425
+ },
1426
+ {
1427
+ "name": "phase_id",
1428
+ "type": "CHAR(36)",
1429
+ "nullable": false
1430
+ },
1431
+ {
1432
+ "name": "process_id",
1433
+ "type": "CHAR(36)",
1434
+ "nullable": false
1435
+ },
1436
+ {
1437
+ "name": "sort_order",
1438
+ "type": "INTEGER",
1439
+ "nullable": false,
1440
+ "default": "0"
1441
+ },
1442
+ {
1443
+ "name": "is_required",
1444
+ "type": "INTEGER",
1445
+ "nullable": false,
1446
+ "default": "1"
1447
+ },
1448
+ {
1449
+ "name": "tailoring_allowed",
1450
+ "type": "INTEGER",
1451
+ "nullable": false,
1452
+ "default": "0"
1453
+ },
1454
+ {
1455
+ "name": "created_at",
1456
+ "type": "DATETIME",
1457
+ "nullable": false,
1458
+ "default": "CURRENT_TIMESTAMP"
1459
+ },
1460
+ {
1461
+ "name": "updated_at",
1462
+ "type": "DATETIME",
1463
+ "nullable": false,
1464
+ "default": "CURRENT_TIMESTAMP"
1465
+ },
1466
+ {
1467
+ "name": "metadata_json",
1468
+ "type": "JSON",
1469
+ "nullable": true
1470
+ }
1471
+ ],
1472
+ "indexes": [
1473
+ {
1474
+ "name": "idx_methodology_phase_processes_process",
1475
+ "def": "CREATE INDEX idx_methodology_phase_processes_process\n ON methodology_phase_processes (process_id)",
1476
+ "table": "methodology_phase_processes",
1477
+ "columns": [
1478
+ "process_id"
1479
+ ]
1480
+ },
1481
+ {
1482
+ "name": "sqlite_autoindex_methodology_phase_processes_3",
1483
+ "def": "UNIQUE (phase_id, sort_order)",
1484
+ "table": "methodology_phase_processes",
1485
+ "columns": [
1486
+ "phase_id",
1487
+ "sort_order"
1488
+ ]
1489
+ },
1490
+ {
1491
+ "name": "sqlite_autoindex_methodology_phase_processes_2",
1492
+ "def": "UNIQUE (phase_id, process_id)",
1493
+ "table": "methodology_phase_processes",
1494
+ "columns": [
1495
+ "phase_id",
1496
+ "process_id"
1497
+ ]
1498
+ },
1499
+ {
1500
+ "name": "sqlite_autoindex_methodology_phase_processes_1",
1501
+ "def": "PRIMARY KEY (phase_process_id)",
1502
+ "table": "methodology_phase_processes",
1503
+ "columns": [
1504
+ "phase_process_id"
1505
+ ]
1506
+ }
1507
+ ],
1508
+ "constraints": [
1509
+ {
1510
+ "name": "phase_process_id",
1511
+ "type": "PRIMARY KEY",
1512
+ "def": "PRIMARY KEY (phase_process_id)",
1513
+ "table": "methodology_phase_processes",
1514
+ "columns": [
1515
+ "phase_process_id"
1516
+ ]
1517
+ },
1518
+ {
1519
+ "name": "- (Foreign key ID: 0)",
1520
+ "type": "FOREIGN KEY",
1521
+ "def": "FOREIGN KEY (process_id) REFERENCES methodology_processes (process_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE",
1522
+ "table": "methodology_phase_processes",
1523
+ "referenced_table": "methodology_processes",
1524
+ "columns": [
1525
+ "process_id"
1526
+ ],
1527
+ "referenced_columns": [
1528
+ "process_id"
1529
+ ]
1530
+ },
1531
+ {
1532
+ "name": "- (Foreign key ID: 1)",
1533
+ "type": "FOREIGN KEY",
1534
+ "def": "FOREIGN KEY (phase_id) REFERENCES methodology_phases (phase_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE",
1535
+ "table": "methodology_phase_processes",
1536
+ "referenced_table": "methodology_phases",
1537
+ "columns": [
1538
+ "phase_id"
1539
+ ],
1540
+ "referenced_columns": [
1541
+ "phase_id"
1542
+ ]
1543
+ },
1544
+ {
1545
+ "name": "sqlite_autoindex_methodology_phase_processes_3",
1546
+ "type": "UNIQUE",
1547
+ "def": "UNIQUE (phase_id, sort_order)",
1548
+ "table": "methodology_phase_processes",
1549
+ "columns": [
1550
+ "phase_id",
1551
+ "sort_order"
1552
+ ]
1553
+ },
1554
+ {
1555
+ "name": "sqlite_autoindex_methodology_phase_processes_2",
1556
+ "type": "UNIQUE",
1557
+ "def": "UNIQUE (phase_id, process_id)",
1558
+ "table": "methodology_phase_processes",
1559
+ "columns": [
1560
+ "phase_id",
1561
+ "process_id"
1562
+ ]
1563
+ },
1564
+ {
1565
+ "name": "sqlite_autoindex_methodology_phase_processes_1",
1566
+ "type": "PRIMARY KEY",
1567
+ "def": "PRIMARY KEY (phase_process_id)",
1568
+ "table": "methodology_phase_processes",
1569
+ "columns": [
1570
+ "phase_process_id"
1571
+ ]
1572
+ },
1573
+ {
1574
+ "name": "-",
1575
+ "type": "CHECK",
1576
+ "def": "CHECK (length(phase_process_id) = 36)",
1577
+ "table": "methodology_phase_processes",
1578
+ "columns": [
1579
+ "phase_process_id",
1580
+ "process_id"
1581
+ ]
1582
+ },
1583
+ {
1584
+ "name": "-",
1585
+ "type": "CHECK",
1586
+ "def": "CHECK (length(phase_id) = 36)",
1587
+ "table": "methodology_phase_processes",
1588
+ "columns": [
1589
+ "phase_id"
1590
+ ]
1591
+ },
1592
+ {
1593
+ "name": "-",
1594
+ "type": "CHECK",
1595
+ "def": "CHECK (length(process_id) = 36)",
1596
+ "table": "methodology_phase_processes",
1597
+ "columns": [
1598
+ "process_id"
1599
+ ]
1600
+ },
1601
+ {
1602
+ "name": "-",
1603
+ "type": "CHECK",
1604
+ "def": "CHECK (is_required IN (0, 1))",
1605
+ "table": "methodology_phase_processes",
1606
+ "columns": [
1607
+ "is_required"
1608
+ ]
1609
+ },
1610
+ {
1611
+ "name": "-",
1612
+ "type": "CHECK",
1613
+ "def": "CHECK (tailoring_allowed IN (0, 1))",
1614
+ "table": "methodology_phase_processes",
1615
+ "columns": [
1616
+ "tailoring_allowed"
1617
+ ]
1618
+ },
1619
+ {
1620
+ "name": "-",
1621
+ "type": "CHECK",
1622
+ "def": "CHECK (metadata_json IS NULL OR json_valid(metadata_json))",
1623
+ "table": "methodology_phase_processes",
1624
+ "columns": [
1625
+ "metadata_json"
1626
+ ]
1627
+ }
1628
+ ],
1629
+ "def": "CREATE TABLE methodology_phase_processes (\n -- phase process 배치 식별자\n phase_process_id CHAR(36) PRIMARY KEY\n CHECK (length(phase_process_id) = 36),\n\n -- 대상 phase 식별자\n phase_id CHAR(36) NOT NULL\n CHECK (length(phase_id) = 36),\n\n -- 배치할 process 식별자\n process_id CHAR(36) NOT NULL\n CHECK (length(process_id) = 36),\n\n -- phase 내 process 순서\n sort_order INTEGER NOT NULL DEFAULT 0,\n\n -- 필수 수행 여부\n is_required INTEGER NOT NULL DEFAULT 1\n CHECK (is_required IN (0, 1)),\n\n -- tailoring 허용 여부\n tailoring_allowed INTEGER NOT NULL DEFAULT 0\n CHECK (tailoring_allowed IN (0, 1)),\n\n -- 생성 시각\n created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 수정 시각\n updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 확장 메타데이터\n metadata_json JSON\n CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n\n FOREIGN KEY (phase_id)\n REFERENCES methodology_phases (phase_id)\n ON DELETE CASCADE,\n\n FOREIGN KEY (process_id)\n REFERENCES methodology_processes (process_id)\n ON DELETE CASCADE,\n\n UNIQUE (phase_id, process_id),\n UNIQUE (phase_id, sort_order)\n)"
1630
+ },
1631
+ {
1632
+ "name": "methodology_activities",
1633
+ "type": "table",
1634
+ "comment": "process 내부의 기본 수행 활동을 관리한다.",
1635
+ "columns": [
1636
+ {
1637
+ "name": "activity_id",
1638
+ "type": "CHAR(36)",
1639
+ "nullable": true
1640
+ },
1641
+ {
1642
+ "name": "process_id",
1643
+ "type": "CHAR(36)",
1644
+ "nullable": false
1645
+ },
1646
+ {
1647
+ "name": "activity_code",
1648
+ "type": "VARCHAR(128)",
1649
+ "nullable": false
1650
+ },
1651
+ {
1652
+ "name": "activity_name",
1653
+ "type": "VARCHAR(256)",
1654
+ "nullable": false
1655
+ },
1656
+ {
1657
+ "name": "activity_purpose",
1658
+ "type": "TEXT",
1659
+ "nullable": true
1660
+ },
1661
+ {
1662
+ "name": "activity_type_code",
1663
+ "type": "VARCHAR(64)",
1664
+ "nullable": false,
1665
+ "default": "'default'"
1666
+ },
1667
+ {
1668
+ "name": "responsible_role_code",
1669
+ "type": "VARCHAR(64)",
1670
+ "nullable": true
1671
+ },
1672
+ {
1673
+ "name": "sort_order",
1674
+ "type": "INTEGER",
1675
+ "nullable": false,
1676
+ "default": "0"
1677
+ },
1678
+ {
1679
+ "name": "is_required",
1680
+ "type": "INTEGER",
1681
+ "nullable": false,
1682
+ "default": "1"
1683
+ },
1684
+ {
1685
+ "name": "tailoring_allowed",
1686
+ "type": "INTEGER",
1687
+ "nullable": false,
1688
+ "default": "0"
1689
+ },
1690
+ {
1691
+ "name": "is_active",
1692
+ "type": "INTEGER",
1693
+ "nullable": false,
1694
+ "default": "1"
1695
+ },
1696
+ {
1697
+ "name": "created_at",
1698
+ "type": "DATETIME",
1699
+ "nullable": false,
1700
+ "default": "CURRENT_TIMESTAMP"
1701
+ },
1702
+ {
1703
+ "name": "updated_at",
1704
+ "type": "DATETIME",
1705
+ "nullable": false,
1706
+ "default": "CURRENT_TIMESTAMP"
1707
+ },
1708
+ {
1709
+ "name": "metadata_json",
1710
+ "type": "JSON",
1711
+ "nullable": true
1712
+ }
1713
+ ],
1714
+ "indexes": [
1715
+ {
1716
+ "name": "idx_methodology_activities_process_order",
1717
+ "def": "CREATE INDEX idx_methodology_activities_process_order\n ON methodology_activities (process_id, sort_order)",
1718
+ "table": "methodology_activities",
1719
+ "columns": [
1720
+ "process_id",
1721
+ "sort_order"
1722
+ ]
1723
+ },
1724
+ {
1725
+ "name": "sqlite_autoindex_methodology_activities_3",
1726
+ "def": "UNIQUE (process_id, sort_order)",
1727
+ "table": "methodology_activities",
1728
+ "columns": [
1729
+ "process_id",
1730
+ "sort_order"
1731
+ ]
1732
+ },
1733
+ {
1734
+ "name": "sqlite_autoindex_methodology_activities_2",
1735
+ "def": "UNIQUE (process_id, activity_code)",
1736
+ "table": "methodology_activities",
1737
+ "columns": [
1738
+ "process_id",
1739
+ "activity_code"
1740
+ ]
1741
+ },
1742
+ {
1743
+ "name": "sqlite_autoindex_methodology_activities_1",
1744
+ "def": "PRIMARY KEY (activity_id)",
1745
+ "table": "methodology_activities",
1746
+ "columns": [
1747
+ "activity_id"
1748
+ ]
1749
+ }
1750
+ ],
1751
+ "constraints": [
1752
+ {
1753
+ "name": "activity_id",
1754
+ "type": "PRIMARY KEY",
1755
+ "def": "PRIMARY KEY (activity_id)",
1756
+ "table": "methodology_activities",
1757
+ "columns": [
1758
+ "activity_id"
1759
+ ]
1760
+ },
1761
+ {
1762
+ "name": "- (Foreign key ID: 0)",
1763
+ "type": "FOREIGN KEY",
1764
+ "def": "FOREIGN KEY (process_id) REFERENCES methodology_processes (process_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE",
1765
+ "table": "methodology_activities",
1766
+ "referenced_table": "methodology_processes",
1767
+ "columns": [
1768
+ "process_id"
1769
+ ],
1770
+ "referenced_columns": [
1771
+ "process_id"
1772
+ ]
1773
+ },
1774
+ {
1775
+ "name": "sqlite_autoindex_methodology_activities_3",
1776
+ "type": "UNIQUE",
1777
+ "def": "UNIQUE (process_id, sort_order)",
1778
+ "table": "methodology_activities",
1779
+ "columns": [
1780
+ "process_id",
1781
+ "sort_order"
1782
+ ]
1783
+ },
1784
+ {
1785
+ "name": "sqlite_autoindex_methodology_activities_2",
1786
+ "type": "UNIQUE",
1787
+ "def": "UNIQUE (process_id, activity_code)",
1788
+ "table": "methodology_activities",
1789
+ "columns": [
1790
+ "process_id",
1791
+ "activity_code"
1792
+ ]
1793
+ },
1794
+ {
1795
+ "name": "sqlite_autoindex_methodology_activities_1",
1796
+ "type": "PRIMARY KEY",
1797
+ "def": "PRIMARY KEY (activity_id)",
1798
+ "table": "methodology_activities",
1799
+ "columns": [
1800
+ "activity_id"
1801
+ ]
1802
+ },
1803
+ {
1804
+ "name": "-",
1805
+ "type": "CHECK",
1806
+ "def": "CHECK (length(activity_id) = 36)",
1807
+ "table": "methodology_activities",
1808
+ "columns": [
1809
+ "activity_id"
1810
+ ]
1811
+ },
1812
+ {
1813
+ "name": "-",
1814
+ "type": "CHECK",
1815
+ "def": "CHECK (length(process_id) = 36)",
1816
+ "table": "methodology_activities",
1817
+ "columns": [
1818
+ "process_id"
1819
+ ]
1820
+ },
1821
+ {
1822
+ "name": "-",
1823
+ "type": "CHECK",
1824
+ "def": "CHECK (is_required IN (0, 1))",
1825
+ "table": "methodology_activities",
1826
+ "columns": [
1827
+ "is_required"
1828
+ ]
1829
+ },
1830
+ {
1831
+ "name": "-",
1832
+ "type": "CHECK",
1833
+ "def": "CHECK (tailoring_allowed IN (0, 1))",
1834
+ "table": "methodology_activities",
1835
+ "columns": [
1836
+ "tailoring_allowed"
1837
+ ]
1838
+ },
1839
+ {
1840
+ "name": "-",
1841
+ "type": "CHECK",
1842
+ "def": "CHECK (is_active IN (0, 1))",
1843
+ "table": "methodology_activities",
1844
+ "columns": [
1845
+ "is_active"
1846
+ ]
1847
+ },
1848
+ {
1849
+ "name": "-",
1850
+ "type": "CHECK",
1851
+ "def": "CHECK (metadata_json IS NULL OR json_valid(metadata_json))",
1852
+ "table": "methodology_activities",
1853
+ "columns": [
1854
+ "metadata_json"
1855
+ ]
1856
+ }
1857
+ ],
1858
+ "def": "CREATE TABLE methodology_activities (\n -- activity 식별자\n activity_id CHAR(36) PRIMARY KEY\n CHECK (length(activity_id) = 36),\n\n -- 소속 process 식별자\n process_id CHAR(36) NOT NULL\n CHECK (length(process_id) = 36),\n\n -- activity 코드\n activity_code VARCHAR(128) NOT NULL,\n\n -- activity 이름\n activity_name VARCHAR(256) NOT NULL,\n\n -- activity 목적\n activity_purpose TEXT,\n\n -- activity 유형 코드\n activity_type_code VARCHAR(64) NOT NULL DEFAULT 'default',\n\n -- 책임 role 코드\n responsible_role_code VARCHAR(64),\n\n -- process 내 activity 순서\n sort_order INTEGER NOT NULL DEFAULT 0,\n\n -- 필수 수행 여부\n is_required INTEGER NOT NULL DEFAULT 1\n CHECK (is_required IN (0, 1)),\n\n -- tailoring 허용 여부\n tailoring_allowed INTEGER NOT NULL DEFAULT 0\n CHECK (tailoring_allowed IN (0, 1)),\n\n -- 활성 여부\n is_active INTEGER NOT NULL DEFAULT 1\n CHECK (is_active IN (0, 1)),\n\n -- 생성 시각\n created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 수정 시각\n updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 확장 메타데이터\n metadata_json JSON\n CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n\n FOREIGN KEY (process_id)\n REFERENCES methodology_processes (process_id)\n ON DELETE CASCADE,\n\n UNIQUE (process_id, activity_code),\n UNIQUE (process_id, sort_order)\n)"
1859
+ },
1860
+ {
1861
+ "name": "methodology_steps",
1862
+ "type": "table",
1863
+ "comment": "activity 하위 순차 절차를 관리한다.",
1864
+ "columns": [
1865
+ {
1866
+ "name": "step_id",
1867
+ "type": "CHAR(36)",
1868
+ "nullable": true
1869
+ },
1870
+ {
1871
+ "name": "activity_id",
1872
+ "type": "CHAR(36)",
1873
+ "nullable": false
1874
+ },
1875
+ {
1876
+ "name": "step_code",
1877
+ "type": "VARCHAR(128)",
1878
+ "nullable": false
1879
+ },
1880
+ {
1881
+ "name": "step_name",
1882
+ "type": "VARCHAR(256)",
1883
+ "nullable": false
1884
+ },
1885
+ {
1886
+ "name": "step_instruction",
1887
+ "type": "TEXT",
1888
+ "nullable": true
1889
+ },
1890
+ {
1891
+ "name": "step_type_code",
1892
+ "type": "VARCHAR(64)",
1893
+ "nullable": false,
1894
+ "default": "'default'"
1895
+ },
1896
+ {
1897
+ "name": "is_required",
1898
+ "type": "INTEGER",
1899
+ "nullable": false,
1900
+ "default": "1"
1901
+ },
1902
+ {
1903
+ "name": "sort_order",
1904
+ "type": "INTEGER",
1905
+ "nullable": false,
1906
+ "default": "0"
1907
+ },
1908
+ {
1909
+ "name": "created_at",
1910
+ "type": "DATETIME",
1911
+ "nullable": false,
1912
+ "default": "CURRENT_TIMESTAMP"
1913
+ },
1914
+ {
1915
+ "name": "updated_at",
1916
+ "type": "DATETIME",
1917
+ "nullable": false,
1918
+ "default": "CURRENT_TIMESTAMP"
1919
+ },
1920
+ {
1921
+ "name": "metadata_json",
1922
+ "type": "JSON",
1923
+ "nullable": true
1924
+ }
1925
+ ],
1926
+ "indexes": [
1927
+ {
1928
+ "name": "idx_methodology_steps_activity_order",
1929
+ "def": "CREATE INDEX idx_methodology_steps_activity_order\n ON methodology_steps (activity_id, sort_order)",
1930
+ "table": "methodology_steps",
1931
+ "columns": [
1932
+ "activity_id",
1933
+ "sort_order"
1934
+ ]
1935
+ },
1936
+ {
1937
+ "name": "sqlite_autoindex_methodology_steps_3",
1938
+ "def": "UNIQUE (activity_id, sort_order)",
1939
+ "table": "methodology_steps",
1940
+ "columns": [
1941
+ "activity_id",
1942
+ "sort_order"
1943
+ ]
1944
+ },
1945
+ {
1946
+ "name": "sqlite_autoindex_methodology_steps_2",
1947
+ "def": "UNIQUE (activity_id, step_code)",
1948
+ "table": "methodology_steps",
1949
+ "columns": [
1950
+ "activity_id",
1951
+ "step_code"
1952
+ ]
1953
+ },
1954
+ {
1955
+ "name": "sqlite_autoindex_methodology_steps_1",
1956
+ "def": "PRIMARY KEY (step_id)",
1957
+ "table": "methodology_steps",
1958
+ "columns": [
1959
+ "step_id"
1960
+ ]
1961
+ }
1962
+ ],
1963
+ "constraints": [
1964
+ {
1965
+ "name": "step_id",
1966
+ "type": "PRIMARY KEY",
1967
+ "def": "PRIMARY KEY (step_id)",
1968
+ "table": "methodology_steps",
1969
+ "columns": [
1970
+ "step_id"
1971
+ ]
1972
+ },
1973
+ {
1974
+ "name": "- (Foreign key ID: 0)",
1975
+ "type": "FOREIGN KEY",
1976
+ "def": "FOREIGN KEY (activity_id) REFERENCES methodology_activities (activity_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE",
1977
+ "table": "methodology_steps",
1978
+ "referenced_table": "methodology_activities",
1979
+ "columns": [
1980
+ "activity_id"
1981
+ ],
1982
+ "referenced_columns": [
1983
+ "activity_id"
1984
+ ]
1985
+ },
1986
+ {
1987
+ "name": "sqlite_autoindex_methodology_steps_3",
1988
+ "type": "UNIQUE",
1989
+ "def": "UNIQUE (activity_id, sort_order)",
1990
+ "table": "methodology_steps",
1991
+ "columns": [
1992
+ "activity_id",
1993
+ "sort_order"
1994
+ ]
1995
+ },
1996
+ {
1997
+ "name": "sqlite_autoindex_methodology_steps_2",
1998
+ "type": "UNIQUE",
1999
+ "def": "UNIQUE (activity_id, step_code)",
2000
+ "table": "methodology_steps",
2001
+ "columns": [
2002
+ "activity_id",
2003
+ "step_code"
2004
+ ]
2005
+ },
2006
+ {
2007
+ "name": "sqlite_autoindex_methodology_steps_1",
2008
+ "type": "PRIMARY KEY",
2009
+ "def": "PRIMARY KEY (step_id)",
2010
+ "table": "methodology_steps",
2011
+ "columns": [
2012
+ "step_id"
2013
+ ]
2014
+ },
2015
+ {
2016
+ "name": "-",
2017
+ "type": "CHECK",
2018
+ "def": "CHECK (length(step_id) = 36)",
2019
+ "table": "methodology_steps",
2020
+ "columns": [
2021
+ "step_id"
2022
+ ]
2023
+ },
2024
+ {
2025
+ "name": "-",
2026
+ "type": "CHECK",
2027
+ "def": "CHECK (length(activity_id) = 36)",
2028
+ "table": "methodology_steps",
2029
+ "columns": [
2030
+ "activity_id"
2031
+ ]
2032
+ },
2033
+ {
2034
+ "name": "-",
2035
+ "type": "CHECK",
2036
+ "def": "CHECK (is_required IN (0, 1))",
2037
+ "table": "methodology_steps",
2038
+ "columns": [
2039
+ "is_required"
2040
+ ]
2041
+ },
2042
+ {
2043
+ "name": "-",
2044
+ "type": "CHECK",
2045
+ "def": "CHECK (metadata_json IS NULL OR json_valid(metadata_json))",
2046
+ "table": "methodology_steps",
2047
+ "columns": [
2048
+ "metadata_json"
2049
+ ]
2050
+ }
2051
+ ],
2052
+ "def": "CREATE TABLE methodology_steps (\n -- step 식별자\n step_id CHAR(36) PRIMARY KEY\n CHECK (length(step_id) = 36),\n\n -- 소속 activity 식별자\n activity_id CHAR(36) NOT NULL\n CHECK (length(activity_id) = 36),\n\n -- step 코드\n step_code VARCHAR(128) NOT NULL,\n\n -- step 이름\n step_name VARCHAR(256) NOT NULL,\n\n -- 수행 절차 설명\n step_instruction TEXT,\n\n -- step 유형 코드\n step_type_code VARCHAR(64) NOT NULL DEFAULT 'default',\n\n -- 필수 여부\n is_required INTEGER NOT NULL DEFAULT 1\n CHECK (is_required IN (0, 1)),\n\n -- activity 내 step 순서\n sort_order INTEGER NOT NULL DEFAULT 0,\n\n -- 생성 시각\n created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 수정 시각\n updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 확장 메타데이터\n metadata_json JSON\n CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n\n FOREIGN KEY (activity_id)\n REFERENCES methodology_activities (activity_id)\n ON DELETE CASCADE,\n\n UNIQUE (activity_id, step_code),\n UNIQUE (activity_id, sort_order)\n)"
2053
+ },
2054
+ {
2055
+ "name": "methodology_stages",
2056
+ "type": "table",
2057
+ "comment": "process 내부 activity grouping, gate, 기준선, 전환 구간을 관리한다.",
2058
+ "columns": [
2059
+ {
2060
+ "name": "stage_id",
2061
+ "type": "CHAR(36)",
2062
+ "nullable": true
2063
+ },
2064
+ {
2065
+ "name": "process_id",
2066
+ "type": "CHAR(36)",
2067
+ "nullable": false
2068
+ },
2069
+ {
2070
+ "name": "stage_code",
2071
+ "type": "VARCHAR(128)",
2072
+ "nullable": false
2073
+ },
2074
+ {
2075
+ "name": "stage_name",
2076
+ "type": "VARCHAR(256)",
2077
+ "nullable": false
2078
+ },
2079
+ {
2080
+ "name": "stage_objective",
2081
+ "type": "TEXT",
2082
+ "nullable": true
2083
+ },
2084
+ {
2085
+ "name": "stage_type_code",
2086
+ "type": "VARCHAR(64)",
2087
+ "nullable": false,
2088
+ "default": "'default'"
2089
+ },
2090
+ {
2091
+ "name": "sort_order",
2092
+ "type": "INTEGER",
2093
+ "nullable": false,
2094
+ "default": "0"
2095
+ },
2096
+ {
2097
+ "name": "is_required",
2098
+ "type": "INTEGER",
2099
+ "nullable": false,
2100
+ "default": "1"
2101
+ },
2102
+ {
2103
+ "name": "tailoring_allowed",
2104
+ "type": "INTEGER",
2105
+ "nullable": false,
2106
+ "default": "0"
2107
+ },
2108
+ {
2109
+ "name": "is_active",
2110
+ "type": "INTEGER",
2111
+ "nullable": false,
2112
+ "default": "1"
2113
+ },
2114
+ {
2115
+ "name": "created_at",
2116
+ "type": "DATETIME",
2117
+ "nullable": false,
2118
+ "default": "CURRENT_TIMESTAMP"
2119
+ },
2120
+ {
2121
+ "name": "updated_at",
2122
+ "type": "DATETIME",
2123
+ "nullable": false,
2124
+ "default": "CURRENT_TIMESTAMP"
2125
+ },
2126
+ {
2127
+ "name": "metadata_json",
2128
+ "type": "JSON",
2129
+ "nullable": true
2130
+ }
2131
+ ],
2132
+ "indexes": [
2133
+ {
2134
+ "name": "idx_methodology_stages_process_order",
2135
+ "def": "CREATE INDEX idx_methodology_stages_process_order\n ON methodology_stages (process_id, sort_order)",
2136
+ "table": "methodology_stages",
2137
+ "columns": [
2138
+ "process_id",
2139
+ "sort_order"
2140
+ ]
2141
+ },
2142
+ {
2143
+ "name": "sqlite_autoindex_methodology_stages_3",
2144
+ "def": "UNIQUE (process_id, sort_order)",
2145
+ "table": "methodology_stages",
2146
+ "columns": [
2147
+ "process_id",
2148
+ "sort_order"
2149
+ ]
2150
+ },
2151
+ {
2152
+ "name": "sqlite_autoindex_methodology_stages_2",
2153
+ "def": "UNIQUE (process_id, stage_code)",
2154
+ "table": "methodology_stages",
2155
+ "columns": [
2156
+ "process_id",
2157
+ "stage_code"
2158
+ ]
2159
+ },
2160
+ {
2161
+ "name": "sqlite_autoindex_methodology_stages_1",
2162
+ "def": "PRIMARY KEY (stage_id)",
2163
+ "table": "methodology_stages",
2164
+ "columns": [
2165
+ "stage_id"
2166
+ ]
2167
+ }
2168
+ ],
2169
+ "constraints": [
2170
+ {
2171
+ "name": "stage_id",
2172
+ "type": "PRIMARY KEY",
2173
+ "def": "PRIMARY KEY (stage_id)",
2174
+ "table": "methodology_stages",
2175
+ "columns": [
2176
+ "stage_id"
2177
+ ]
2178
+ },
2179
+ {
2180
+ "name": "- (Foreign key ID: 0)",
2181
+ "type": "FOREIGN KEY",
2182
+ "def": "FOREIGN KEY (process_id) REFERENCES methodology_processes (process_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE",
2183
+ "table": "methodology_stages",
2184
+ "referenced_table": "methodology_processes",
2185
+ "columns": [
2186
+ "process_id"
2187
+ ],
2188
+ "referenced_columns": [
2189
+ "process_id"
2190
+ ]
2191
+ },
2192
+ {
2193
+ "name": "sqlite_autoindex_methodology_stages_3",
2194
+ "type": "UNIQUE",
2195
+ "def": "UNIQUE (process_id, sort_order)",
2196
+ "table": "methodology_stages",
2197
+ "columns": [
2198
+ "process_id",
2199
+ "sort_order"
2200
+ ]
2201
+ },
2202
+ {
2203
+ "name": "sqlite_autoindex_methodology_stages_2",
2204
+ "type": "UNIQUE",
2205
+ "def": "UNIQUE (process_id, stage_code)",
2206
+ "table": "methodology_stages",
2207
+ "columns": [
2208
+ "process_id",
2209
+ "stage_code"
2210
+ ]
2211
+ },
2212
+ {
2213
+ "name": "sqlite_autoindex_methodology_stages_1",
2214
+ "type": "PRIMARY KEY",
2215
+ "def": "PRIMARY KEY (stage_id)",
2216
+ "table": "methodology_stages",
2217
+ "columns": [
2218
+ "stage_id"
2219
+ ]
2220
+ },
2221
+ {
2222
+ "name": "-",
2223
+ "type": "CHECK",
2224
+ "def": "CHECK (length(stage_id) = 36)",
2225
+ "table": "methodology_stages",
2226
+ "columns": [
2227
+ "stage_id"
2228
+ ]
2229
+ },
2230
+ {
2231
+ "name": "-",
2232
+ "type": "CHECK",
2233
+ "def": "CHECK (length(process_id) = 36)",
2234
+ "table": "methodology_stages",
2235
+ "columns": [
2236
+ "process_id"
2237
+ ]
2238
+ },
2239
+ {
2240
+ "name": "-",
2241
+ "type": "CHECK",
2242
+ "def": "CHECK (is_required IN (0, 1))",
2243
+ "table": "methodology_stages",
2244
+ "columns": [
2245
+ "is_required"
2246
+ ]
2247
+ },
2248
+ {
2249
+ "name": "-",
2250
+ "type": "CHECK",
2251
+ "def": "CHECK (tailoring_allowed IN (0, 1))",
2252
+ "table": "methodology_stages",
2253
+ "columns": [
2254
+ "tailoring_allowed"
2255
+ ]
2256
+ },
2257
+ {
2258
+ "name": "-",
2259
+ "type": "CHECK",
2260
+ "def": "CHECK (is_active IN (0, 1))",
2261
+ "table": "methodology_stages",
2262
+ "columns": [
2263
+ "is_active"
2264
+ ]
2265
+ },
2266
+ {
2267
+ "name": "-",
2268
+ "type": "CHECK",
2269
+ "def": "CHECK (metadata_json IS NULL OR json_valid(metadata_json))",
2270
+ "table": "methodology_stages",
2271
+ "columns": [
2272
+ "metadata_json"
2273
+ ]
2274
+ }
2275
+ ],
2276
+ "def": "CREATE TABLE methodology_stages (\n -- stage 식별자\n stage_id CHAR(36) PRIMARY KEY\n CHECK (length(stage_id) = 36),\n\n -- 소속 process 식별자\n process_id CHAR(36) NOT NULL\n CHECK (length(process_id) = 36),\n\n -- stage 코드\n stage_code VARCHAR(128) NOT NULL,\n\n -- stage 이름\n stage_name VARCHAR(256) NOT NULL,\n\n -- stage 목표\n stage_objective TEXT,\n\n -- stage 유형 코드\n stage_type_code VARCHAR(64) NOT NULL DEFAULT 'default',\n\n -- process 내 stage 순서\n sort_order INTEGER NOT NULL DEFAULT 0,\n\n -- 필수 여부\n is_required INTEGER NOT NULL DEFAULT 1\n CHECK (is_required IN (0, 1)),\n\n -- tailoring 허용 여부\n tailoring_allowed INTEGER NOT NULL DEFAULT 0\n CHECK (tailoring_allowed IN (0, 1)),\n\n -- 활성 여부\n is_active INTEGER NOT NULL DEFAULT 1\n CHECK (is_active IN (0, 1)),\n\n -- 생성 시각\n created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 수정 시각\n updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 확장 메타데이터\n metadata_json JSON\n CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n\n FOREIGN KEY (process_id)\n REFERENCES methodology_processes (process_id)\n ON DELETE CASCADE,\n\n UNIQUE (process_id, stage_code),\n UNIQUE (process_id, sort_order)\n)"
2277
+ },
2278
+ {
2279
+ "name": "methodology_stage_activities",
2280
+ "type": "table",
2281
+ "comment": "stage와 activity의 포함 관계를 관리한다.",
2282
+ "columns": [
2283
+ {
2284
+ "name": "stage_activity_id",
2285
+ "type": "CHAR(36)",
2286
+ "nullable": true
2287
+ },
2288
+ {
2289
+ "name": "stage_id",
2290
+ "type": "CHAR(36)",
2291
+ "nullable": false
2292
+ },
2293
+ {
2294
+ "name": "activity_id",
2295
+ "type": "CHAR(36)",
2296
+ "nullable": false
2297
+ },
2298
+ {
2299
+ "name": "sort_order",
2300
+ "type": "INTEGER",
2301
+ "nullable": false,
2302
+ "default": "0"
2303
+ },
2304
+ {
2305
+ "name": "is_required",
2306
+ "type": "INTEGER",
2307
+ "nullable": false,
2308
+ "default": "1"
2309
+ },
2310
+ {
2311
+ "name": "tailoring_allowed",
2312
+ "type": "INTEGER",
2313
+ "nullable": false,
2314
+ "default": "0"
2315
+ },
2316
+ {
2317
+ "name": "created_at",
2318
+ "type": "DATETIME",
2319
+ "nullable": false,
2320
+ "default": "CURRENT_TIMESTAMP"
2321
+ },
2322
+ {
2323
+ "name": "updated_at",
2324
+ "type": "DATETIME",
2325
+ "nullable": false,
2326
+ "default": "CURRENT_TIMESTAMP"
2327
+ },
2328
+ {
2329
+ "name": "metadata_json",
2330
+ "type": "JSON",
2331
+ "nullable": true
2332
+ }
2333
+ ],
2334
+ "indexes": [
2335
+ {
2336
+ "name": "idx_methodology_stage_activities_activity",
2337
+ "def": "CREATE INDEX idx_methodology_stage_activities_activity\n ON methodology_stage_activities (activity_id)",
2338
+ "table": "methodology_stage_activities",
2339
+ "columns": [
2340
+ "activity_id"
2341
+ ]
2342
+ },
2343
+ {
2344
+ "name": "sqlite_autoindex_methodology_stage_activities_3",
2345
+ "def": "UNIQUE (stage_id, sort_order)",
2346
+ "table": "methodology_stage_activities",
2347
+ "columns": [
2348
+ "stage_id",
2349
+ "sort_order"
2350
+ ]
2351
+ },
2352
+ {
2353
+ "name": "sqlite_autoindex_methodology_stage_activities_2",
2354
+ "def": "UNIQUE (stage_id, activity_id)",
2355
+ "table": "methodology_stage_activities",
2356
+ "columns": [
2357
+ "stage_id",
2358
+ "activity_id"
2359
+ ]
2360
+ },
2361
+ {
2362
+ "name": "sqlite_autoindex_methodology_stage_activities_1",
2363
+ "def": "PRIMARY KEY (stage_activity_id)",
2364
+ "table": "methodology_stage_activities",
2365
+ "columns": [
2366
+ "stage_activity_id"
2367
+ ]
2368
+ }
2369
+ ],
2370
+ "constraints": [
2371
+ {
2372
+ "name": "stage_activity_id",
2373
+ "type": "PRIMARY KEY",
2374
+ "def": "PRIMARY KEY (stage_activity_id)",
2375
+ "table": "methodology_stage_activities",
2376
+ "columns": [
2377
+ "stage_activity_id"
2378
+ ]
2379
+ },
2380
+ {
2381
+ "name": "- (Foreign key ID: 0)",
2382
+ "type": "FOREIGN KEY",
2383
+ "def": "FOREIGN KEY (activity_id) REFERENCES methodology_activities (activity_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE",
2384
+ "table": "methodology_stage_activities",
2385
+ "referenced_table": "methodology_activities",
2386
+ "columns": [
2387
+ "activity_id"
2388
+ ],
2389
+ "referenced_columns": [
2390
+ "activity_id"
2391
+ ]
2392
+ },
2393
+ {
2394
+ "name": "- (Foreign key ID: 1)",
2395
+ "type": "FOREIGN KEY",
2396
+ "def": "FOREIGN KEY (stage_id) REFERENCES methodology_stages (stage_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE",
2397
+ "table": "methodology_stage_activities",
2398
+ "referenced_table": "methodology_stages",
2399
+ "columns": [
2400
+ "stage_id"
2401
+ ],
2402
+ "referenced_columns": [
2403
+ "stage_id"
2404
+ ]
2405
+ },
2406
+ {
2407
+ "name": "sqlite_autoindex_methodology_stage_activities_3",
2408
+ "type": "UNIQUE",
2409
+ "def": "UNIQUE (stage_id, sort_order)",
2410
+ "table": "methodology_stage_activities",
2411
+ "columns": [
2412
+ "stage_id",
2413
+ "sort_order"
2414
+ ]
2415
+ },
2416
+ {
2417
+ "name": "sqlite_autoindex_methodology_stage_activities_2",
2418
+ "type": "UNIQUE",
2419
+ "def": "UNIQUE (stage_id, activity_id)",
2420
+ "table": "methodology_stage_activities",
2421
+ "columns": [
2422
+ "stage_id",
2423
+ "activity_id"
2424
+ ]
2425
+ },
2426
+ {
2427
+ "name": "sqlite_autoindex_methodology_stage_activities_1",
2428
+ "type": "PRIMARY KEY",
2429
+ "def": "PRIMARY KEY (stage_activity_id)",
2430
+ "table": "methodology_stage_activities",
2431
+ "columns": [
2432
+ "stage_activity_id"
2433
+ ]
2434
+ },
2435
+ {
2436
+ "name": "-",
2437
+ "type": "CHECK",
2438
+ "def": "CHECK (length(stage_activity_id) = 36)",
2439
+ "table": "methodology_stage_activities",
2440
+ "columns": [
2441
+ "stage_activity_id",
2442
+ "activity_id"
2443
+ ]
2444
+ },
2445
+ {
2446
+ "name": "-",
2447
+ "type": "CHECK",
2448
+ "def": "CHECK (length(stage_id) = 36)",
2449
+ "table": "methodology_stage_activities",
2450
+ "columns": [
2451
+ "stage_id"
2452
+ ]
2453
+ },
2454
+ {
2455
+ "name": "-",
2456
+ "type": "CHECK",
2457
+ "def": "CHECK (length(activity_id) = 36)",
2458
+ "table": "methodology_stage_activities",
2459
+ "columns": [
2460
+ "activity_id"
2461
+ ]
2462
+ },
2463
+ {
2464
+ "name": "-",
2465
+ "type": "CHECK",
2466
+ "def": "CHECK (is_required IN (0, 1))",
2467
+ "table": "methodology_stage_activities",
2468
+ "columns": [
2469
+ "is_required"
2470
+ ]
2471
+ },
2472
+ {
2473
+ "name": "-",
2474
+ "type": "CHECK",
2475
+ "def": "CHECK (tailoring_allowed IN (0, 1))",
2476
+ "table": "methodology_stage_activities",
2477
+ "columns": [
2478
+ "tailoring_allowed"
2479
+ ]
2480
+ },
2481
+ {
2482
+ "name": "-",
2483
+ "type": "CHECK",
2484
+ "def": "CHECK (metadata_json IS NULL OR json_valid(metadata_json))",
2485
+ "table": "methodology_stage_activities",
2486
+ "columns": [
2487
+ "metadata_json"
2488
+ ]
2489
+ }
2490
+ ],
2491
+ "def": "CREATE TABLE methodology_stage_activities (\n -- stage activity 배치 식별자\n stage_activity_id CHAR(36) PRIMARY KEY\n CHECK (length(stage_activity_id) = 36),\n\n -- stage 식별자\n stage_id CHAR(36) NOT NULL\n CHECK (length(stage_id) = 36),\n\n -- activity 식별자\n activity_id CHAR(36) NOT NULL\n CHECK (length(activity_id) = 36),\n\n -- stage 내 activity 순서\n sort_order INTEGER NOT NULL DEFAULT 0,\n\n -- 필수 여부\n is_required INTEGER NOT NULL DEFAULT 1\n CHECK (is_required IN (0, 1)),\n\n -- tailoring 허용 여부\n tailoring_allowed INTEGER NOT NULL DEFAULT 0\n CHECK (tailoring_allowed IN (0, 1)),\n\n -- 생성 시각\n created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 수정 시각\n updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 확장 메타데이터\n metadata_json JSON\n CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n\n FOREIGN KEY (stage_id)\n REFERENCES methodology_stages (stage_id)\n ON DELETE CASCADE,\n\n FOREIGN KEY (activity_id)\n REFERENCES methodology_activities (activity_id)\n ON DELETE CASCADE,\n\n UNIQUE (stage_id, activity_id),\n UNIQUE (stage_id, sort_order)\n)"
2492
+ },
2493
+ {
2494
+ "name": "methodology_activity_artifact_requirements",
2495
+ "type": "table",
2496
+ "comment": "activity의 input/output/supporting 산출물 요구를 관리한다.",
2497
+ "columns": [
2498
+ {
2499
+ "name": "activity_artifact_requirement_id",
2500
+ "type": "CHAR(36)",
2501
+ "nullable": true
2502
+ },
2503
+ {
2504
+ "name": "activity_id",
2505
+ "type": "CHAR(36)",
2506
+ "nullable": false
2507
+ },
2508
+ {
2509
+ "name": "artifact_standard_code",
2510
+ "type": "VARCHAR(128)",
2511
+ "nullable": false
2512
+ },
2513
+ {
2514
+ "name": "artifact_standard_version",
2515
+ "type": "VARCHAR(64)",
2516
+ "nullable": false
2517
+ },
2518
+ {
2519
+ "name": "artifact_component_code",
2520
+ "type": "VARCHAR(128)",
2521
+ "nullable": true
2522
+ },
2523
+ {
2524
+ "name": "artifact_component_role_code",
2525
+ "type": "VARCHAR(64)",
2526
+ "nullable": true
2527
+ },
2528
+ {
2529
+ "name": "requirement_role_code",
2530
+ "type": "VARCHAR(32)",
2531
+ "nullable": false
2532
+ },
2533
+ {
2534
+ "name": "output_usage_code",
2535
+ "type": "VARCHAR(32)",
2536
+ "nullable": true
2537
+ },
2538
+ {
2539
+ "name": "is_primary",
2540
+ "type": "INTEGER",
2541
+ "nullable": false,
2542
+ "default": "0"
2543
+ },
2544
+ {
2545
+ "name": "is_required",
2546
+ "type": "INTEGER",
2547
+ "nullable": false,
2548
+ "default": "1"
2549
+ },
2550
+ {
2551
+ "name": "validation_required",
2552
+ "type": "INTEGER",
2553
+ "nullable": false,
2554
+ "default": "0"
2555
+ },
2556
+ {
2557
+ "name": "sort_order",
2558
+ "type": "INTEGER",
2559
+ "nullable": false,
2560
+ "default": "0"
2561
+ },
2562
+ {
2563
+ "name": "created_at",
2564
+ "type": "DATETIME",
2565
+ "nullable": false,
2566
+ "default": "CURRENT_TIMESTAMP"
2567
+ },
2568
+ {
2569
+ "name": "updated_at",
2570
+ "type": "DATETIME",
2571
+ "nullable": false,
2572
+ "default": "CURRENT_TIMESTAMP"
2573
+ },
2574
+ {
2575
+ "name": "metadata_json",
2576
+ "type": "JSON",
2577
+ "nullable": true
2578
+ }
2579
+ ],
2580
+ "indexes": [
2581
+ {
2582
+ "name": "ux_methodology_activity_artifact_requirements_unique_target",
2583
+ "def": "CREATE UNIQUE INDEX ux_methodology_activity_artifact_requirements_unique_target\n ON methodology_activity_artifact_requirements (\n activity_id,\n artifact_standard_code,\n artifact_standard_version,\n requirement_role_code,\n COALESCE(artifact_component_code, '')\n )",
2584
+ "table": "methodology_activity_artifact_requirements",
2585
+ "columns": [
2586
+ "activity_id",
2587
+ "artifact_standard_code",
2588
+ "artifact_standard_version",
2589
+ "requirement_role_code"
2590
+ ]
2591
+ },
2592
+ {
2593
+ "name": "idx_methodology_activity_artifact_requirements_component",
2594
+ "def": "CREATE INDEX idx_methodology_activity_artifact_requirements_component\n ON methodology_activity_artifact_requirements (artifact_standard_code, artifact_component_code)",
2595
+ "table": "methodology_activity_artifact_requirements",
2596
+ "columns": [
2597
+ "artifact_standard_code",
2598
+ "artifact_component_code"
2599
+ ]
2600
+ },
2601
+ {
2602
+ "name": "idx_methodology_activity_artifact_requirements_activity_role",
2603
+ "def": "CREATE INDEX idx_methodology_activity_artifact_requirements_activity_role\n ON methodology_activity_artifact_requirements (activity_id, requirement_role_code)",
2604
+ "table": "methodology_activity_artifact_requirements",
2605
+ "columns": [
2606
+ "activity_id",
2607
+ "requirement_role_code"
2608
+ ]
2609
+ },
2610
+ {
2611
+ "name": "ux_methodology_activity_artifact_requirements_primary_output",
2612
+ "def": "CREATE UNIQUE INDEX ux_methodology_activity_artifact_requirements_primary_output\n ON methodology_activity_artifact_requirements (activity_id)\n WHERE is_primary = 1",
2613
+ "table": "methodology_activity_artifact_requirements",
2614
+ "columns": [
2615
+ "activity_id"
2616
+ ]
2617
+ },
2618
+ {
2619
+ "name": "sqlite_autoindex_methodology_activity_artifact_requirements_2",
2620
+ "def": "UNIQUE (activity_id, sort_order)",
2621
+ "table": "methodology_activity_artifact_requirements",
2622
+ "columns": [
2623
+ "activity_id",
2624
+ "sort_order"
2625
+ ]
2626
+ },
2627
+ {
2628
+ "name": "sqlite_autoindex_methodology_activity_artifact_requirements_1",
2629
+ "def": "PRIMARY KEY (activity_artifact_requirement_id)",
2630
+ "table": "methodology_activity_artifact_requirements",
2631
+ "columns": [
2632
+ "activity_artifact_requirement_id"
2633
+ ]
2634
+ }
2635
+ ],
2636
+ "constraints": [
2637
+ {
2638
+ "name": "activity_artifact_requirement_id",
2639
+ "type": "PRIMARY KEY",
2640
+ "def": "PRIMARY KEY (activity_artifact_requirement_id)",
2641
+ "table": "methodology_activity_artifact_requirements",
2642
+ "columns": [
2643
+ "activity_artifact_requirement_id"
2644
+ ]
2645
+ },
2646
+ {
2647
+ "name": "- (Foreign key ID: 0)",
2648
+ "type": "FOREIGN KEY",
2649
+ "def": "FOREIGN KEY (activity_id) REFERENCES methodology_activities (activity_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE",
2650
+ "table": "methodology_activity_artifact_requirements",
2651
+ "referenced_table": "methodology_activities",
2652
+ "columns": [
2653
+ "activity_id"
2654
+ ],
2655
+ "referenced_columns": [
2656
+ "activity_id"
2657
+ ]
2658
+ },
2659
+ {
2660
+ "name": "sqlite_autoindex_methodology_activity_artifact_requirements_2",
2661
+ "type": "UNIQUE",
2662
+ "def": "UNIQUE (activity_id, sort_order)",
2663
+ "table": "methodology_activity_artifact_requirements",
2664
+ "columns": [
2665
+ "activity_id",
2666
+ "sort_order"
2667
+ ]
2668
+ },
2669
+ {
2670
+ "name": "sqlite_autoindex_methodology_activity_artifact_requirements_1",
2671
+ "type": "PRIMARY KEY",
2672
+ "def": "PRIMARY KEY (activity_artifact_requirement_id)",
2673
+ "table": "methodology_activity_artifact_requirements",
2674
+ "columns": [
2675
+ "activity_artifact_requirement_id"
2676
+ ]
2677
+ },
2678
+ {
2679
+ "name": "-",
2680
+ "type": "CHECK",
2681
+ "def": "CHECK (length(activity_artifact_requirement_id) = 36)",
2682
+ "table": "methodology_activity_artifact_requirements",
2683
+ "columns": [
2684
+ "activity_artifact_requirement_id"
2685
+ ]
2686
+ },
2687
+ {
2688
+ "name": "-",
2689
+ "type": "CHECK",
2690
+ "def": "CHECK (length(activity_id) = 36)",
2691
+ "table": "methodology_activity_artifact_requirements",
2692
+ "columns": [
2693
+ "activity_id"
2694
+ ]
2695
+ },
2696
+ {
2697
+ "name": "-",
2698
+ "type": "CHECK",
2699
+ "def": "CHECK (requirement_role_code IN ('input', 'output', 'supporting'))",
2700
+ "table": "methodology_activity_artifact_requirements",
2701
+ "columns": [
2702
+ "requirement_role_code"
2703
+ ]
2704
+ },
2705
+ {
2706
+ "name": "-",
2707
+ "type": "CHECK",
2708
+ "def": "CHECK (output_usage_code IS NULL OR output_usage_code IN ('produces', 'refines', 'reviews', 'consolidates'))",
2709
+ "table": "methodology_activity_artifact_requirements",
2710
+ "columns": [
2711
+ "output_usage_code"
2712
+ ]
2713
+ },
2714
+ {
2715
+ "name": "-",
2716
+ "type": "CHECK",
2717
+ "def": "CHECK (is_primary IN (0, 1))",
2718
+ "table": "methodology_activity_artifact_requirements",
2719
+ "columns": [
2720
+ "is_primary"
2721
+ ]
2722
+ },
2723
+ {
2724
+ "name": "-",
2725
+ "type": "CHECK",
2726
+ "def": "CHECK (is_required IN (0, 1))",
2727
+ "table": "methodology_activity_artifact_requirements",
2728
+ "columns": [
2729
+ "is_required"
2730
+ ]
2731
+ },
2732
+ {
2733
+ "name": "-",
2734
+ "type": "CHECK",
2735
+ "def": "CHECK (validation_required IN (0, 1))",
2736
+ "table": "methodology_activity_artifact_requirements",
2737
+ "columns": [
2738
+ "validation_required"
2739
+ ]
2740
+ },
2741
+ {
2742
+ "name": "-",
2743
+ "type": "CHECK",
2744
+ "def": "CHECK (metadata_json IS NULL OR json_valid(metadata_json))",
2745
+ "table": "methodology_activity_artifact_requirements",
2746
+ "columns": [
2747
+ "metadata_json"
2748
+ ]
2749
+ }
2750
+ ],
2751
+ "def": "CREATE TABLE methodology_activity_artifact_requirements (\n -- activity artifact requirement 식별자\n activity_artifact_requirement_id CHAR(36) PRIMARY KEY\n CHECK (length(activity_artifact_requirement_id) = 36),\n\n -- 소속 activity 식별자\n activity_id CHAR(36) NOT NULL\n CHECK (length(activity_id) = 36),\n\n -- artifact standard 코드\n artifact_standard_code VARCHAR(128) NOT NULL,\n\n -- artifact standard 버전\n artifact_standard_version VARCHAR(64) NOT NULL,\n\n -- artifact-standard가 정의한 document component 코드. 산출물 전체가 아니라 특정 본문/부록 구성 단위를 대상으로 할 때 사용한다.\n artifact_component_code VARCHAR(128),\n\n -- artifact-standard document component 역할 코드. 예: MAIN, APPENDIX\n artifact_component_role_code VARCHAR(64),\n\n -- 산출물 요구 역할 코드\n requirement_role_code VARCHAR(32) NOT NULL\n CHECK (requirement_role_code IN ('input', 'output', 'supporting')),\n\n -- output activity가 산출물을 어떻게 다루는지 나타내는 사용 코드\n output_usage_code VARCHAR(32)\n CHECK (output_usage_code IS NULL OR output_usage_code IN ('produces', 'refines', 'reviews', 'consolidates')),\n\n -- activity 대표 output 여부\n is_primary INTEGER NOT NULL DEFAULT 0\n CHECK (is_primary IN (0, 1)),\n\n -- 필수 여부\n is_required INTEGER NOT NULL DEFAULT 1\n CHECK (is_required IN (0, 1)),\n\n -- validation 필수 여부\n validation_required INTEGER NOT NULL DEFAULT 0\n CHECK (validation_required IN (0, 1)),\n\n -- activity 내 정렬 순서\n sort_order INTEGER NOT NULL DEFAULT 0,\n\n -- 생성 시각\n created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 수정 시각\n updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 확장 메타데이터\n metadata_json JSON\n CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n\n FOREIGN KEY (activity_id)\n REFERENCES methodology_activities (activity_id)\n ON DELETE CASCADE,\n\n UNIQUE (activity_id, sort_order)\n)"
2752
+ },
2753
+ {
2754
+ "name": "methodology_stage_artifact_requirements",
2755
+ "type": "table",
2756
+ "comment": "stage gate, baseline, handoff, approval에 필요한 추가 산출물 요구를 관리한다.",
2757
+ "columns": [
2758
+ {
2759
+ "name": "stage_artifact_requirement_id",
2760
+ "type": "CHAR(36)",
2761
+ "nullable": true
2762
+ },
2763
+ {
2764
+ "name": "stage_id",
2765
+ "type": "CHAR(36)",
2766
+ "nullable": false
2767
+ },
2768
+ {
2769
+ "name": "artifact_standard_code",
2770
+ "type": "VARCHAR(128)",
2771
+ "nullable": false
2772
+ },
2773
+ {
2774
+ "name": "artifact_standard_version",
2775
+ "type": "VARCHAR(64)",
2776
+ "nullable": false
2777
+ },
2778
+ {
2779
+ "name": "requirement_role_code",
2780
+ "type": "VARCHAR(32)",
2781
+ "nullable": false
2782
+ },
2783
+ {
2784
+ "name": "is_required",
2785
+ "type": "INTEGER",
2786
+ "nullable": false,
2787
+ "default": "1"
2788
+ },
2789
+ {
2790
+ "name": "validation_required",
2791
+ "type": "INTEGER",
2792
+ "nullable": false,
2793
+ "default": "0"
2794
+ },
2795
+ {
2796
+ "name": "sort_order",
2797
+ "type": "INTEGER",
2798
+ "nullable": false,
2799
+ "default": "0"
2800
+ },
2801
+ {
2802
+ "name": "created_at",
2803
+ "type": "DATETIME",
2804
+ "nullable": false,
2805
+ "default": "CURRENT_TIMESTAMP"
2806
+ },
2807
+ {
2808
+ "name": "updated_at",
2809
+ "type": "DATETIME",
2810
+ "nullable": false,
2811
+ "default": "CURRENT_TIMESTAMP"
2812
+ },
2813
+ {
2814
+ "name": "metadata_json",
2815
+ "type": "JSON",
2816
+ "nullable": true
2817
+ }
2818
+ ],
2819
+ "indexes": [
2820
+ {
2821
+ "name": "idx_methodology_stage_artifact_requirements_stage_role",
2822
+ "def": "CREATE INDEX idx_methodology_stage_artifact_requirements_stage_role\n ON methodology_stage_artifact_requirements (stage_id, requirement_role_code)",
2823
+ "table": "methodology_stage_artifact_requirements",
2824
+ "columns": [
2825
+ "stage_id",
2826
+ "requirement_role_code"
2827
+ ]
2828
+ },
2829
+ {
2830
+ "name": "sqlite_autoindex_methodology_stage_artifact_requirements_3",
2831
+ "def": "UNIQUE (stage_id, sort_order)",
2832
+ "table": "methodology_stage_artifact_requirements",
2833
+ "columns": [
2834
+ "stage_id",
2835
+ "sort_order"
2836
+ ]
2837
+ },
2838
+ {
2839
+ "name": "sqlite_autoindex_methodology_stage_artifact_requirements_2",
2840
+ "def": "UNIQUE (stage_id, artifact_standard_code, artifact_standard_version, requirement_role_code)",
2841
+ "table": "methodology_stage_artifact_requirements",
2842
+ "columns": [
2843
+ "stage_id",
2844
+ "artifact_standard_code",
2845
+ "artifact_standard_version",
2846
+ "requirement_role_code"
2847
+ ]
2848
+ },
2849
+ {
2850
+ "name": "sqlite_autoindex_methodology_stage_artifact_requirements_1",
2851
+ "def": "PRIMARY KEY (stage_artifact_requirement_id)",
2852
+ "table": "methodology_stage_artifact_requirements",
2853
+ "columns": [
2854
+ "stage_artifact_requirement_id"
2855
+ ]
2856
+ }
2857
+ ],
2858
+ "constraints": [
2859
+ {
2860
+ "name": "stage_artifact_requirement_id",
2861
+ "type": "PRIMARY KEY",
2862
+ "def": "PRIMARY KEY (stage_artifact_requirement_id)",
2863
+ "table": "methodology_stage_artifact_requirements",
2864
+ "columns": [
2865
+ "stage_artifact_requirement_id"
2866
+ ]
2867
+ },
2868
+ {
2869
+ "name": "- (Foreign key ID: 0)",
2870
+ "type": "FOREIGN KEY",
2871
+ "def": "FOREIGN KEY (stage_id) REFERENCES methodology_stages (stage_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE",
2872
+ "table": "methodology_stage_artifact_requirements",
2873
+ "referenced_table": "methodology_stages",
2874
+ "columns": [
2875
+ "stage_id"
2876
+ ],
2877
+ "referenced_columns": [
2878
+ "stage_id"
2879
+ ]
2880
+ },
2881
+ {
2882
+ "name": "sqlite_autoindex_methodology_stage_artifact_requirements_3",
2883
+ "type": "UNIQUE",
2884
+ "def": "UNIQUE (stage_id, sort_order)",
2885
+ "table": "methodology_stage_artifact_requirements",
2886
+ "columns": [
2887
+ "stage_id",
2888
+ "sort_order"
2889
+ ]
2890
+ },
2891
+ {
2892
+ "name": "sqlite_autoindex_methodology_stage_artifact_requirements_2",
2893
+ "type": "UNIQUE",
2894
+ "def": "UNIQUE (stage_id, artifact_standard_code, artifact_standard_version, requirement_role_code)",
2895
+ "table": "methodology_stage_artifact_requirements",
2896
+ "columns": [
2897
+ "stage_id",
2898
+ "artifact_standard_code",
2899
+ "artifact_standard_version",
2900
+ "requirement_role_code"
2901
+ ]
2902
+ },
2903
+ {
2904
+ "name": "sqlite_autoindex_methodology_stage_artifact_requirements_1",
2905
+ "type": "PRIMARY KEY",
2906
+ "def": "PRIMARY KEY (stage_artifact_requirement_id)",
2907
+ "table": "methodology_stage_artifact_requirements",
2908
+ "columns": [
2909
+ "stage_artifact_requirement_id"
2910
+ ]
2911
+ },
2912
+ {
2913
+ "name": "-",
2914
+ "type": "CHECK",
2915
+ "def": "CHECK (length(stage_artifact_requirement_id) = 36)",
2916
+ "table": "methodology_stage_artifact_requirements",
2917
+ "columns": [
2918
+ "stage_artifact_requirement_id"
2919
+ ]
2920
+ },
2921
+ {
2922
+ "name": "-",
2923
+ "type": "CHECK",
2924
+ "def": "CHECK (length(stage_id) = 36)",
2925
+ "table": "methodology_stage_artifact_requirements",
2926
+ "columns": [
2927
+ "stage_id"
2928
+ ]
2929
+ },
2930
+ {
2931
+ "name": "-",
2932
+ "type": "CHECK",
2933
+ "def": "CHECK (requirement_role_code IN ('required', 'supporting'))",
2934
+ "table": "methodology_stage_artifact_requirements",
2935
+ "columns": [
2936
+ "requirement_role_code"
2937
+ ]
2938
+ },
2939
+ {
2940
+ "name": "-",
2941
+ "type": "CHECK",
2942
+ "def": "CHECK (is_required IN (0, 1))",
2943
+ "table": "methodology_stage_artifact_requirements",
2944
+ "columns": [
2945
+ "is_required"
2946
+ ]
2947
+ },
2948
+ {
2949
+ "name": "-",
2950
+ "type": "CHECK",
2951
+ "def": "CHECK (validation_required IN (0, 1))",
2952
+ "table": "methodology_stage_artifact_requirements",
2953
+ "columns": [
2954
+ "validation_required"
2955
+ ]
2956
+ },
2957
+ {
2958
+ "name": "-",
2959
+ "type": "CHECK",
2960
+ "def": "CHECK (metadata_json IS NULL OR json_valid(metadata_json))",
2961
+ "table": "methodology_stage_artifact_requirements",
2962
+ "columns": [
2963
+ "metadata_json"
2964
+ ]
2965
+ }
2966
+ ],
2967
+ "def": "CREATE TABLE methodology_stage_artifact_requirements (\n -- stage artifact requirement 식별자\n stage_artifact_requirement_id CHAR(36) PRIMARY KEY\n CHECK (length(stage_artifact_requirement_id) = 36),\n\n -- 소속 stage 식별자\n stage_id CHAR(36) NOT NULL\n CHECK (length(stage_id) = 36),\n\n -- artifact standard 코드\n artifact_standard_code VARCHAR(128) NOT NULL,\n\n -- artifact standard 버전\n artifact_standard_version VARCHAR(64) NOT NULL,\n\n -- stage 산출물 요구 역할 코드\n requirement_role_code VARCHAR(32) NOT NULL\n CHECK (requirement_role_code IN ('required', 'supporting')),\n\n -- 필수 여부\n is_required INTEGER NOT NULL DEFAULT 1\n CHECK (is_required IN (0, 1)),\n\n -- validation 필수 여부\n validation_required INTEGER NOT NULL DEFAULT 0\n CHECK (validation_required IN (0, 1)),\n\n -- stage 내 정렬 순서\n sort_order INTEGER NOT NULL DEFAULT 0,\n\n -- 생성 시각\n created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 수정 시각\n updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 확장 메타데이터\n metadata_json JSON\n CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n\n FOREIGN KEY (stage_id)\n REFERENCES methodology_stages (stage_id)\n ON DELETE CASCADE,\n\n UNIQUE (stage_id, artifact_standard_code, artifact_standard_version, requirement_role_code),\n UNIQUE (stage_id, sort_order)\n)"
2968
+ },
2969
+ {
2970
+ "name": "methodology_stage_criteria",
2971
+ "type": "table",
2972
+ "comment": "stage의 entry, exit, gate 판단 기준을 관리한다.",
2973
+ "columns": [
2974
+ {
2975
+ "name": "stage_criteria_id",
2976
+ "type": "CHAR(36)",
2977
+ "nullable": true
2978
+ },
2979
+ {
2980
+ "name": "stage_id",
2981
+ "type": "CHAR(36)",
2982
+ "nullable": false
2983
+ },
2984
+ {
2985
+ "name": "criteria_type_code",
2986
+ "type": "VARCHAR(32)",
2987
+ "nullable": false
2988
+ },
2989
+ {
2990
+ "name": "criteria_name",
2991
+ "type": "VARCHAR(256)",
2992
+ "nullable": false
2993
+ },
2994
+ {
2995
+ "name": "criteria_text",
2996
+ "type": "TEXT",
2997
+ "nullable": false
2998
+ },
2999
+ {
3000
+ "name": "is_required",
3001
+ "type": "INTEGER",
3002
+ "nullable": false,
3003
+ "default": "1"
3004
+ },
3005
+ {
3006
+ "name": "validation_required",
3007
+ "type": "INTEGER",
3008
+ "nullable": false,
3009
+ "default": "0"
3010
+ },
3011
+ {
3012
+ "name": "severity_code",
3013
+ "type": "VARCHAR(32)",
3014
+ "nullable": false,
3015
+ "default": "'error'"
3016
+ },
3017
+ {
3018
+ "name": "sort_order",
3019
+ "type": "INTEGER",
3020
+ "nullable": false,
3021
+ "default": "0"
3022
+ },
3023
+ {
3024
+ "name": "created_at",
3025
+ "type": "DATETIME",
3026
+ "nullable": false,
3027
+ "default": "CURRENT_TIMESTAMP"
3028
+ },
3029
+ {
3030
+ "name": "updated_at",
3031
+ "type": "DATETIME",
3032
+ "nullable": false,
3033
+ "default": "CURRENT_TIMESTAMP"
3034
+ },
3035
+ {
3036
+ "name": "metadata_json",
3037
+ "type": "JSON",
3038
+ "nullable": true
3039
+ }
3040
+ ],
3041
+ "indexes": [
3042
+ {
3043
+ "name": "idx_methodology_stage_criteria_stage_type",
3044
+ "def": "CREATE INDEX idx_methodology_stage_criteria_stage_type\n ON methodology_stage_criteria (stage_id, criteria_type_code)",
3045
+ "table": "methodology_stage_criteria",
3046
+ "columns": [
3047
+ "stage_id",
3048
+ "criteria_type_code"
3049
+ ]
3050
+ },
3051
+ {
3052
+ "name": "sqlite_autoindex_methodology_stage_criteria_2",
3053
+ "def": "UNIQUE (stage_id, criteria_type_code, sort_order)",
3054
+ "table": "methodology_stage_criteria",
3055
+ "columns": [
3056
+ "stage_id",
3057
+ "criteria_type_code",
3058
+ "sort_order"
3059
+ ]
3060
+ },
3061
+ {
3062
+ "name": "sqlite_autoindex_methodology_stage_criteria_1",
3063
+ "def": "PRIMARY KEY (stage_criteria_id)",
3064
+ "table": "methodology_stage_criteria",
3065
+ "columns": [
3066
+ "stage_criteria_id"
3067
+ ]
3068
+ }
3069
+ ],
3070
+ "constraints": [
3071
+ {
3072
+ "name": "stage_criteria_id",
3073
+ "type": "PRIMARY KEY",
3074
+ "def": "PRIMARY KEY (stage_criteria_id)",
3075
+ "table": "methodology_stage_criteria",
3076
+ "columns": [
3077
+ "stage_criteria_id"
3078
+ ]
3079
+ },
3080
+ {
3081
+ "name": "- (Foreign key ID: 0)",
3082
+ "type": "FOREIGN KEY",
3083
+ "def": "FOREIGN KEY (stage_id) REFERENCES methodology_stages (stage_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE",
3084
+ "table": "methodology_stage_criteria",
3085
+ "referenced_table": "methodology_stages",
3086
+ "columns": [
3087
+ "stage_id"
3088
+ ],
3089
+ "referenced_columns": [
3090
+ "stage_id"
3091
+ ]
3092
+ },
3093
+ {
3094
+ "name": "sqlite_autoindex_methodology_stage_criteria_2",
3095
+ "type": "UNIQUE",
3096
+ "def": "UNIQUE (stage_id, criteria_type_code, sort_order)",
3097
+ "table": "methodology_stage_criteria",
3098
+ "columns": [
3099
+ "stage_id",
3100
+ "criteria_type_code",
3101
+ "sort_order"
3102
+ ]
3103
+ },
3104
+ {
3105
+ "name": "sqlite_autoindex_methodology_stage_criteria_1",
3106
+ "type": "PRIMARY KEY",
3107
+ "def": "PRIMARY KEY (stage_criteria_id)",
3108
+ "table": "methodology_stage_criteria",
3109
+ "columns": [
3110
+ "stage_criteria_id"
3111
+ ]
3112
+ },
3113
+ {
3114
+ "name": "-",
3115
+ "type": "CHECK",
3116
+ "def": "CHECK (length(stage_criteria_id) = 36)",
3117
+ "table": "methodology_stage_criteria",
3118
+ "columns": [
3119
+ "stage_criteria_id"
3120
+ ]
3121
+ },
3122
+ {
3123
+ "name": "-",
3124
+ "type": "CHECK",
3125
+ "def": "CHECK (length(stage_id) = 36)",
3126
+ "table": "methodology_stage_criteria",
3127
+ "columns": [
3128
+ "stage_id"
3129
+ ]
3130
+ },
3131
+ {
3132
+ "name": "-",
3133
+ "type": "CHECK",
3134
+ "def": "CHECK (criteria_type_code IN ('entry', 'exit', 'gate'))",
3135
+ "table": "methodology_stage_criteria",
3136
+ "columns": [
3137
+ "criteria_type_code"
3138
+ ]
3139
+ },
3140
+ {
3141
+ "name": "-",
3142
+ "type": "CHECK",
3143
+ "def": "CHECK (is_required IN (0, 1))",
3144
+ "table": "methodology_stage_criteria",
3145
+ "columns": [
3146
+ "is_required"
3147
+ ]
3148
+ },
3149
+ {
3150
+ "name": "-",
3151
+ "type": "CHECK",
3152
+ "def": "CHECK (validation_required IN (0, 1))",
3153
+ "table": "methodology_stage_criteria",
3154
+ "columns": [
3155
+ "validation_required"
3156
+ ]
3157
+ },
3158
+ {
3159
+ "name": "-",
3160
+ "type": "CHECK",
3161
+ "def": "CHECK (severity_code IN ('info', 'warning', 'error', 'critical'))",
3162
+ "table": "methodology_stage_criteria",
3163
+ "columns": [
3164
+ "severity_code"
3165
+ ]
3166
+ },
3167
+ {
3168
+ "name": "-",
3169
+ "type": "CHECK",
3170
+ "def": "CHECK (metadata_json IS NULL OR json_valid(metadata_json))",
3171
+ "table": "methodology_stage_criteria",
3172
+ "columns": [
3173
+ "metadata_json"
3174
+ ]
3175
+ }
3176
+ ],
3177
+ "def": "CREATE TABLE methodology_stage_criteria (\n -- stage criteria 식별자\n stage_criteria_id CHAR(36) PRIMARY KEY\n CHECK (length(stage_criteria_id) = 36),\n\n -- 소속 stage 식별자\n stage_id CHAR(36) NOT NULL\n CHECK (length(stage_id) = 36),\n\n -- criteria 유형 코드\n criteria_type_code VARCHAR(32) NOT NULL\n CHECK (criteria_type_code IN ('entry', 'exit', 'gate')),\n\n -- criteria 이름\n criteria_name VARCHAR(256) NOT NULL,\n\n -- criteria 내용\n criteria_text TEXT NOT NULL,\n\n -- 필수 여부\n is_required INTEGER NOT NULL DEFAULT 1\n CHECK (is_required IN (0, 1)),\n\n -- validation 필수 여부\n validation_required INTEGER NOT NULL DEFAULT 0\n CHECK (validation_required IN (0, 1)),\n\n -- 심각도 코드\n severity_code VARCHAR(32) NOT NULL DEFAULT 'error'\n CHECK (severity_code IN ('info', 'warning', 'error', 'critical')),\n\n -- stage criteria 정렬 순서\n sort_order INTEGER NOT NULL DEFAULT 0,\n\n -- 생성 시각\n created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 수정 시각\n updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 확장 메타데이터\n metadata_json JSON\n CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n\n FOREIGN KEY (stage_id)\n REFERENCES methodology_stages (stage_id)\n ON DELETE CASCADE,\n\n UNIQUE (stage_id, criteria_type_code, sort_order)\n)"
3178
+ },
3179
+ {
3180
+ "name": "methodology_activity_criteria",
3181
+ "type": "table",
3182
+ "comment": "activity의 completion 판단 기준을 관리한다.",
3183
+ "columns": [
3184
+ {
3185
+ "name": "activity_criteria_id",
3186
+ "type": "CHAR(36)",
3187
+ "nullable": true
3188
+ },
3189
+ {
3190
+ "name": "activity_id",
3191
+ "type": "CHAR(36)",
3192
+ "nullable": false
3193
+ },
3194
+ {
3195
+ "name": "criteria_type_code",
3196
+ "type": "VARCHAR(32)",
3197
+ "nullable": false,
3198
+ "default": "'completion'"
3199
+ },
3200
+ {
3201
+ "name": "criteria_name",
3202
+ "type": "VARCHAR(256)",
3203
+ "nullable": false
3204
+ },
3205
+ {
3206
+ "name": "criteria_text",
3207
+ "type": "TEXT",
3208
+ "nullable": false
3209
+ },
3210
+ {
3211
+ "name": "is_required",
3212
+ "type": "INTEGER",
3213
+ "nullable": false,
3214
+ "default": "1"
3215
+ },
3216
+ {
3217
+ "name": "validation_required",
3218
+ "type": "INTEGER",
3219
+ "nullable": false,
3220
+ "default": "0"
3221
+ },
3222
+ {
3223
+ "name": "severity_code",
3224
+ "type": "VARCHAR(32)",
3225
+ "nullable": false,
3226
+ "default": "'error'"
3227
+ },
3228
+ {
3229
+ "name": "sort_order",
3230
+ "type": "INTEGER",
3231
+ "nullable": false,
3232
+ "default": "0"
3233
+ },
3234
+ {
3235
+ "name": "created_at",
3236
+ "type": "DATETIME",
3237
+ "nullable": false,
3238
+ "default": "CURRENT_TIMESTAMP"
3239
+ },
3240
+ {
3241
+ "name": "updated_at",
3242
+ "type": "DATETIME",
3243
+ "nullable": false,
3244
+ "default": "CURRENT_TIMESTAMP"
3245
+ },
3246
+ {
3247
+ "name": "metadata_json",
3248
+ "type": "JSON",
3249
+ "nullable": true
3250
+ }
3251
+ ],
3252
+ "indexes": [
3253
+ {
3254
+ "name": "idx_methodology_activity_criteria_activity",
3255
+ "def": "CREATE INDEX idx_methodology_activity_criteria_activity\n ON methodology_activity_criteria (activity_id)",
3256
+ "table": "methodology_activity_criteria",
3257
+ "columns": [
3258
+ "activity_id"
3259
+ ]
3260
+ },
3261
+ {
3262
+ "name": "sqlite_autoindex_methodology_activity_criteria_2",
3263
+ "def": "UNIQUE (activity_id, sort_order)",
3264
+ "table": "methodology_activity_criteria",
3265
+ "columns": [
3266
+ "activity_id",
3267
+ "sort_order"
3268
+ ]
3269
+ },
3270
+ {
3271
+ "name": "sqlite_autoindex_methodology_activity_criteria_1",
3272
+ "def": "PRIMARY KEY (activity_criteria_id)",
3273
+ "table": "methodology_activity_criteria",
3274
+ "columns": [
3275
+ "activity_criteria_id"
3276
+ ]
3277
+ }
3278
+ ],
3279
+ "constraints": [
3280
+ {
3281
+ "name": "activity_criteria_id",
3282
+ "type": "PRIMARY KEY",
3283
+ "def": "PRIMARY KEY (activity_criteria_id)",
3284
+ "table": "methodology_activity_criteria",
3285
+ "columns": [
3286
+ "activity_criteria_id"
3287
+ ]
3288
+ },
3289
+ {
3290
+ "name": "- (Foreign key ID: 0)",
3291
+ "type": "FOREIGN KEY",
3292
+ "def": "FOREIGN KEY (activity_id) REFERENCES methodology_activities (activity_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE",
3293
+ "table": "methodology_activity_criteria",
3294
+ "referenced_table": "methodology_activities",
3295
+ "columns": [
3296
+ "activity_id"
3297
+ ],
3298
+ "referenced_columns": [
3299
+ "activity_id"
3300
+ ]
3301
+ },
3302
+ {
3303
+ "name": "sqlite_autoindex_methodology_activity_criteria_2",
3304
+ "type": "UNIQUE",
3305
+ "def": "UNIQUE (activity_id, sort_order)",
3306
+ "table": "methodology_activity_criteria",
3307
+ "columns": [
3308
+ "activity_id",
3309
+ "sort_order"
3310
+ ]
3311
+ },
3312
+ {
3313
+ "name": "sqlite_autoindex_methodology_activity_criteria_1",
3314
+ "type": "PRIMARY KEY",
3315
+ "def": "PRIMARY KEY (activity_criteria_id)",
3316
+ "table": "methodology_activity_criteria",
3317
+ "columns": [
3318
+ "activity_criteria_id"
3319
+ ]
3320
+ },
3321
+ {
3322
+ "name": "-",
3323
+ "type": "CHECK",
3324
+ "def": "CHECK (length(activity_criteria_id) = 36)",
3325
+ "table": "methodology_activity_criteria",
3326
+ "columns": [
3327
+ "activity_criteria_id"
3328
+ ]
3329
+ },
3330
+ {
3331
+ "name": "-",
3332
+ "type": "CHECK",
3333
+ "def": "CHECK (length(activity_id) = 36)",
3334
+ "table": "methodology_activity_criteria",
3335
+ "columns": [
3336
+ "activity_id"
3337
+ ]
3338
+ },
3339
+ {
3340
+ "name": "-",
3341
+ "type": "CHECK",
3342
+ "def": "CHECK (criteria_type_code = 'completion')",
3343
+ "table": "methodology_activity_criteria",
3344
+ "columns": [
3345
+ "criteria_type_code"
3346
+ ]
3347
+ },
3348
+ {
3349
+ "name": "-",
3350
+ "type": "CHECK",
3351
+ "def": "CHECK (is_required IN (0, 1))",
3352
+ "table": "methodology_activity_criteria",
3353
+ "columns": [
3354
+ "is_required"
3355
+ ]
3356
+ },
3357
+ {
3358
+ "name": "-",
3359
+ "type": "CHECK",
3360
+ "def": "CHECK (validation_required IN (0, 1))",
3361
+ "table": "methodology_activity_criteria",
3362
+ "columns": [
3363
+ "validation_required"
3364
+ ]
3365
+ },
3366
+ {
3367
+ "name": "-",
3368
+ "type": "CHECK",
3369
+ "def": "CHECK (severity_code IN ('info', 'warning', 'error', 'critical'))",
3370
+ "table": "methodology_activity_criteria",
3371
+ "columns": [
3372
+ "severity_code"
3373
+ ]
3374
+ },
3375
+ {
3376
+ "name": "-",
3377
+ "type": "CHECK",
3378
+ "def": "CHECK (metadata_json IS NULL OR json_valid(metadata_json))",
3379
+ "table": "methodology_activity_criteria",
3380
+ "columns": [
3381
+ "metadata_json"
3382
+ ]
3383
+ }
3384
+ ],
3385
+ "def": "CREATE TABLE methodology_activity_criteria (\n -- activity criteria 식별자\n activity_criteria_id CHAR(36) PRIMARY KEY\n CHECK (length(activity_criteria_id) = 36),\n\n -- 소속 activity 식별자\n activity_id CHAR(36) NOT NULL\n CHECK (length(activity_id) = 36),\n\n -- criteria 유형 코드\n criteria_type_code VARCHAR(32) NOT NULL DEFAULT 'completion'\n CHECK (criteria_type_code = 'completion'),\n\n -- criteria 이름\n criteria_name VARCHAR(256) NOT NULL,\n\n -- criteria 내용\n criteria_text TEXT NOT NULL,\n\n -- 필수 여부\n is_required INTEGER NOT NULL DEFAULT 1\n CHECK (is_required IN (0, 1)),\n\n -- validation 필수 여부\n validation_required INTEGER NOT NULL DEFAULT 0\n CHECK (validation_required IN (0, 1)),\n\n -- 심각도 코드\n severity_code VARCHAR(32) NOT NULL DEFAULT 'error'\n CHECK (severity_code IN ('info', 'warning', 'error', 'critical')),\n\n -- activity criteria 정렬 순서\n sort_order INTEGER NOT NULL DEFAULT 0,\n\n -- 생성 시각\n created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 수정 시각\n updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 확장 메타데이터\n metadata_json JSON\n CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n\n FOREIGN KEY (activity_id)\n REFERENCES methodology_activities (activity_id)\n ON DELETE CASCADE,\n\n UNIQUE (activity_id, sort_order)\n)"
3386
+ },
3387
+ {
3388
+ "name": "methodology_handoff_requirements",
3389
+ "type": "table",
3390
+ "comment": "phase, process, stage, activity 간 전달 요구를 관리한다.",
3391
+ "columns": [
3392
+ {
3393
+ "name": "handoff_requirement_id",
3394
+ "type": "CHAR(36)",
3395
+ "nullable": true
3396
+ },
3397
+ {
3398
+ "name": "source_scope_code",
3399
+ "type": "VARCHAR(32)",
3400
+ "nullable": false
3401
+ },
3402
+ {
3403
+ "name": "source_ref_id",
3404
+ "type": "CHAR(36)",
3405
+ "nullable": false
3406
+ },
3407
+ {
3408
+ "name": "target_scope_code",
3409
+ "type": "VARCHAR(32)",
3410
+ "nullable": false
3411
+ },
3412
+ {
3413
+ "name": "target_ref_id",
3414
+ "type": "CHAR(36)",
3415
+ "nullable": false
3416
+ },
3417
+ {
3418
+ "name": "handoff_type_code",
3419
+ "type": "VARCHAR(32)",
3420
+ "nullable": false
3421
+ },
3422
+ {
3423
+ "name": "handoff_item_name",
3424
+ "type": "VARCHAR(256)",
3425
+ "nullable": false
3426
+ },
3427
+ {
3428
+ "name": "handoff_description",
3429
+ "type": "TEXT",
3430
+ "nullable": true
3431
+ },
3432
+ {
3433
+ "name": "artifact_standard_code",
3434
+ "type": "VARCHAR(128)",
3435
+ "nullable": true
3436
+ },
3437
+ {
3438
+ "name": "artifact_standard_version",
3439
+ "type": "VARCHAR(64)",
3440
+ "nullable": true
3441
+ },
3442
+ {
3443
+ "name": "is_required",
3444
+ "type": "INTEGER",
3445
+ "nullable": false,
3446
+ "default": "1"
3447
+ },
3448
+ {
3449
+ "name": "validation_required",
3450
+ "type": "INTEGER",
3451
+ "nullable": false,
3452
+ "default": "0"
3453
+ },
3454
+ {
3455
+ "name": "sort_order",
3456
+ "type": "INTEGER",
3457
+ "nullable": false,
3458
+ "default": "0"
3459
+ },
3460
+ {
3461
+ "name": "created_at",
3462
+ "type": "DATETIME",
3463
+ "nullable": false,
3464
+ "default": "CURRENT_TIMESTAMP"
3465
+ },
3466
+ {
3467
+ "name": "updated_at",
3468
+ "type": "DATETIME",
3469
+ "nullable": false,
3470
+ "default": "CURRENT_TIMESTAMP"
3471
+ },
3472
+ {
3473
+ "name": "metadata_json",
3474
+ "type": "JSON",
3475
+ "nullable": true
3476
+ }
3477
+ ],
3478
+ "indexes": [
3479
+ {
3480
+ "name": "idx_methodology_handoff_requirements_target",
3481
+ "def": "CREATE INDEX idx_methodology_handoff_requirements_target\n ON methodology_handoff_requirements (target_scope_code, target_ref_id)",
3482
+ "table": "methodology_handoff_requirements",
3483
+ "columns": [
3484
+ "target_scope_code",
3485
+ "target_ref_id"
3486
+ ]
3487
+ },
3488
+ {
3489
+ "name": "idx_methodology_handoff_requirements_source",
3490
+ "def": "CREATE INDEX idx_methodology_handoff_requirements_source\n ON methodology_handoff_requirements (source_scope_code, source_ref_id)",
3491
+ "table": "methodology_handoff_requirements",
3492
+ "columns": [
3493
+ "source_scope_code",
3494
+ "source_ref_id"
3495
+ ]
3496
+ },
3497
+ {
3498
+ "name": "sqlite_autoindex_methodology_handoff_requirements_1",
3499
+ "def": "PRIMARY KEY (handoff_requirement_id)",
3500
+ "table": "methodology_handoff_requirements",
3501
+ "columns": [
3502
+ "handoff_requirement_id"
3503
+ ]
3504
+ }
3505
+ ],
3506
+ "constraints": [
3507
+ {
3508
+ "name": "handoff_requirement_id",
3509
+ "type": "PRIMARY KEY",
3510
+ "def": "PRIMARY KEY (handoff_requirement_id)",
3511
+ "table": "methodology_handoff_requirements",
3512
+ "columns": [
3513
+ "handoff_requirement_id"
3514
+ ]
3515
+ },
3516
+ {
3517
+ "name": "sqlite_autoindex_methodology_handoff_requirements_1",
3518
+ "type": "PRIMARY KEY",
3519
+ "def": "PRIMARY KEY (handoff_requirement_id)",
3520
+ "table": "methodology_handoff_requirements",
3521
+ "columns": [
3522
+ "handoff_requirement_id"
3523
+ ]
3524
+ },
3525
+ {
3526
+ "name": "-",
3527
+ "type": "CHECK",
3528
+ "def": "CHECK (length(handoff_requirement_id) = 36)",
3529
+ "table": "methodology_handoff_requirements",
3530
+ "columns": [
3531
+ "handoff_requirement_id"
3532
+ ]
3533
+ },
3534
+ {
3535
+ "name": "-",
3536
+ "type": "CHECK",
3537
+ "def": "CHECK (source_scope_code IN ('phase', 'process', 'stage', 'activity'))",
3538
+ "table": "methodology_handoff_requirements",
3539
+ "columns": [
3540
+ "source_scope_code"
3541
+ ]
3542
+ },
3543
+ {
3544
+ "name": "-",
3545
+ "type": "CHECK",
3546
+ "def": "CHECK (length(source_ref_id) = 36)",
3547
+ "table": "methodology_handoff_requirements",
3548
+ "columns": [
3549
+ "source_ref_id"
3550
+ ]
3551
+ },
3552
+ {
3553
+ "name": "-",
3554
+ "type": "CHECK",
3555
+ "def": "CHECK (target_scope_code IN ('phase', 'process', 'stage', 'activity'))",
3556
+ "table": "methodology_handoff_requirements",
3557
+ "columns": [
3558
+ "target_scope_code"
3559
+ ]
3560
+ },
3561
+ {
3562
+ "name": "-",
3563
+ "type": "CHECK",
3564
+ "def": "CHECK (length(target_ref_id) = 36)",
3565
+ "table": "methodology_handoff_requirements",
3566
+ "columns": [
3567
+ "target_ref_id"
3568
+ ]
3569
+ },
3570
+ {
3571
+ "name": "-",
3572
+ "type": "CHECK",
3573
+ "def": "CHECK (handoff_type_code IN ('artifact', 'issue', 'risk', 'decision', 'constraint', 'approval', 'context'))",
3574
+ "table": "methodology_handoff_requirements",
3575
+ "columns": [
3576
+ "handoff_type_code"
3577
+ ]
3578
+ },
3579
+ {
3580
+ "name": "-",
3581
+ "type": "CHECK",
3582
+ "def": "CHECK (is_required IN (0, 1))",
3583
+ "table": "methodology_handoff_requirements",
3584
+ "columns": [
3585
+ "is_required"
3586
+ ]
3587
+ },
3588
+ {
3589
+ "name": "-",
3590
+ "type": "CHECK",
3591
+ "def": "CHECK (validation_required IN (0, 1))",
3592
+ "table": "methodology_handoff_requirements",
3593
+ "columns": [
3594
+ "validation_required"
3595
+ ]
3596
+ },
3597
+ {
3598
+ "name": "-",
3599
+ "type": "CHECK",
3600
+ "def": "CHECK (metadata_json IS NULL OR json_valid(metadata_json))",
3601
+ "table": "methodology_handoff_requirements",
3602
+ "columns": [
3603
+ "metadata_json"
3604
+ ]
3605
+ },
3606
+ {
3607
+ "name": "-",
3608
+ "type": "CHECK",
3609
+ "def": "CHECK ( (artifact_standard_code IS NULL AND artifact_standard_version IS NULL) OR (artifact_standard_code IS NOT NULL AND artifact_standard_version IS NOT NULL) )",
3610
+ "table": "methodology_handoff_requirements",
3611
+ "columns": [
3612
+ "artifact_standard_code",
3613
+ "artifact_standard_version"
3614
+ ]
3615
+ }
3616
+ ],
3617
+ "def": "CREATE TABLE methodology_handoff_requirements (\n -- handoff requirement 식별자\n handoff_requirement_id CHAR(36) PRIMARY KEY\n CHECK (length(handoff_requirement_id) = 36),\n\n -- 전달 원천 scope 코드\n source_scope_code VARCHAR(32) NOT NULL\n CHECK (source_scope_code IN ('phase', 'process', 'stage', 'activity')),\n\n -- 전달 원천 참조 식별자\n source_ref_id CHAR(36) NOT NULL\n CHECK (length(source_ref_id) = 36),\n\n -- 전달 대상 scope 코드\n target_scope_code VARCHAR(32) NOT NULL\n CHECK (target_scope_code IN ('phase', 'process', 'stage', 'activity')),\n\n -- 전달 대상 참조 식별자\n target_ref_id CHAR(36) NOT NULL\n CHECK (length(target_ref_id) = 36),\n\n -- handoff 유형 코드\n handoff_type_code VARCHAR(32) NOT NULL\n CHECK (handoff_type_code IN ('artifact', 'issue', 'risk', 'decision', 'constraint', 'approval', 'context')),\n\n -- handoff 항목명\n handoff_item_name VARCHAR(256) NOT NULL,\n\n -- handoff 설명\n handoff_description TEXT,\n\n -- artifact standard 코드. artifact 유형 handoff일 때 사용할 수 있다.\n artifact_standard_code VARCHAR(128),\n\n -- artifact standard 버전\n artifact_standard_version VARCHAR(64),\n\n -- 필수 여부\n is_required INTEGER NOT NULL DEFAULT 1\n CHECK (is_required IN (0, 1)),\n\n -- validation 필수 여부\n validation_required INTEGER NOT NULL DEFAULT 0\n CHECK (validation_required IN (0, 1)),\n\n -- 정렬 순서\n sort_order INTEGER NOT NULL DEFAULT 0,\n\n -- 생성 시각\n created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 수정 시각\n updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 확장 메타데이터\n metadata_json JSON\n CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n\n CHECK (\n (artifact_standard_code IS NULL AND artifact_standard_version IS NULL)\n OR (artifact_standard_code IS NOT NULL AND artifact_standard_version IS NOT NULL)\n )\n)"
3618
+ },
3619
+ {
3620
+ "name": "methodology_baseline_requirements",
3621
+ "type": "table",
3622
+ "comment": "baseline이 필요한 scope와 trigger를 관리한다.",
3623
+ "columns": [
3624
+ {
3625
+ "name": "baseline_requirement_id",
3626
+ "type": "CHAR(36)",
3627
+ "nullable": true
3628
+ },
3629
+ {
3630
+ "name": "baseline_scope_code",
3631
+ "type": "VARCHAR(32)",
3632
+ "nullable": false
3633
+ },
3634
+ {
3635
+ "name": "baseline_scope_ref_id",
3636
+ "type": "CHAR(36)",
3637
+ "nullable": false
3638
+ },
3639
+ {
3640
+ "name": "baseline_trigger_code",
3641
+ "type": "VARCHAR(32)",
3642
+ "nullable": false
3643
+ },
3644
+ {
3645
+ "name": "baseline_name",
3646
+ "type": "VARCHAR(256)",
3647
+ "nullable": false
3648
+ },
3649
+ {
3650
+ "name": "baseline_description",
3651
+ "type": "TEXT",
3652
+ "nullable": true
3653
+ },
3654
+ {
3655
+ "name": "is_required",
3656
+ "type": "INTEGER",
3657
+ "nullable": false,
3658
+ "default": "1"
3659
+ },
3660
+ {
3661
+ "name": "validation_required",
3662
+ "type": "INTEGER",
3663
+ "nullable": false,
3664
+ "default": "0"
3665
+ },
3666
+ {
3667
+ "name": "sort_order",
3668
+ "type": "INTEGER",
3669
+ "nullable": false,
3670
+ "default": "0"
3671
+ },
3672
+ {
3673
+ "name": "created_at",
3674
+ "type": "DATETIME",
3675
+ "nullable": false,
3676
+ "default": "CURRENT_TIMESTAMP"
3677
+ },
3678
+ {
3679
+ "name": "updated_at",
3680
+ "type": "DATETIME",
3681
+ "nullable": false,
3682
+ "default": "CURRENT_TIMESTAMP"
3683
+ },
3684
+ {
3685
+ "name": "metadata_json",
3686
+ "type": "JSON",
3687
+ "nullable": true
3688
+ }
3689
+ ],
3690
+ "indexes": [
3691
+ {
3692
+ "name": "idx_methodology_baseline_requirements_scope",
3693
+ "def": "CREATE INDEX idx_methodology_baseline_requirements_scope\n ON methodology_baseline_requirements (baseline_scope_code, baseline_scope_ref_id)",
3694
+ "table": "methodology_baseline_requirements",
3695
+ "columns": [
3696
+ "baseline_scope_code",
3697
+ "baseline_scope_ref_id"
3698
+ ]
3699
+ },
3700
+ {
3701
+ "name": "sqlite_autoindex_methodology_baseline_requirements_1",
3702
+ "def": "PRIMARY KEY (baseline_requirement_id)",
3703
+ "table": "methodology_baseline_requirements",
3704
+ "columns": [
3705
+ "baseline_requirement_id"
3706
+ ]
3707
+ }
3708
+ ],
3709
+ "constraints": [
3710
+ {
3711
+ "name": "baseline_requirement_id",
3712
+ "type": "PRIMARY KEY",
3713
+ "def": "PRIMARY KEY (baseline_requirement_id)",
3714
+ "table": "methodology_baseline_requirements",
3715
+ "columns": [
3716
+ "baseline_requirement_id"
3717
+ ]
3718
+ },
3719
+ {
3720
+ "name": "sqlite_autoindex_methodology_baseline_requirements_1",
3721
+ "type": "PRIMARY KEY",
3722
+ "def": "PRIMARY KEY (baseline_requirement_id)",
3723
+ "table": "methodology_baseline_requirements",
3724
+ "columns": [
3725
+ "baseline_requirement_id"
3726
+ ]
3727
+ },
3728
+ {
3729
+ "name": "-",
3730
+ "type": "CHECK",
3731
+ "def": "CHECK (length(baseline_requirement_id) = 36)",
3732
+ "table": "methodology_baseline_requirements",
3733
+ "columns": [
3734
+ "baseline_requirement_id"
3735
+ ]
3736
+ },
3737
+ {
3738
+ "name": "-",
3739
+ "type": "CHECK",
3740
+ "def": "CHECK (baseline_scope_code IN ('phase', 'process', 'stage', 'activity'))",
3741
+ "table": "methodology_baseline_requirements",
3742
+ "columns": [
3743
+ "baseline_scope_code"
3744
+ ]
3745
+ },
3746
+ {
3747
+ "name": "-",
3748
+ "type": "CHECK",
3749
+ "def": "CHECK (length(baseline_scope_ref_id) = 36)",
3750
+ "table": "methodology_baseline_requirements",
3751
+ "columns": [
3752
+ "baseline_scope_ref_id"
3753
+ ]
3754
+ },
3755
+ {
3756
+ "name": "-",
3757
+ "type": "CHECK",
3758
+ "def": "CHECK (baseline_trigger_code IN ('entry', 'exit', 'gate', 'handoff', 'approval', 'manual'))",
3759
+ "table": "methodology_baseline_requirements",
3760
+ "columns": [
3761
+ "baseline_trigger_code"
3762
+ ]
3763
+ },
3764
+ {
3765
+ "name": "-",
3766
+ "type": "CHECK",
3767
+ "def": "CHECK (is_required IN (0, 1))",
3768
+ "table": "methodology_baseline_requirements",
3769
+ "columns": [
3770
+ "is_required"
3771
+ ]
3772
+ },
3773
+ {
3774
+ "name": "-",
3775
+ "type": "CHECK",
3776
+ "def": "CHECK (validation_required IN (0, 1))",
3777
+ "table": "methodology_baseline_requirements",
3778
+ "columns": [
3779
+ "validation_required"
3780
+ ]
3781
+ },
3782
+ {
3783
+ "name": "-",
3784
+ "type": "CHECK",
3785
+ "def": "CHECK (metadata_json IS NULL OR json_valid(metadata_json))",
3786
+ "table": "methodology_baseline_requirements",
3787
+ "columns": [
3788
+ "metadata_json"
3789
+ ]
3790
+ }
3791
+ ],
3792
+ "def": "CREATE TABLE methodology_baseline_requirements (\n -- baseline requirement 식별자\n baseline_requirement_id CHAR(36) PRIMARY KEY\n CHECK (length(baseline_requirement_id) = 36),\n\n -- baseline scope 코드\n baseline_scope_code VARCHAR(32) NOT NULL\n CHECK (baseline_scope_code IN ('phase', 'process', 'stage', 'activity')),\n\n -- baseline scope 참조 식별자\n baseline_scope_ref_id CHAR(36) NOT NULL\n CHECK (length(baseline_scope_ref_id) = 36),\n\n -- baseline trigger 코드\n baseline_trigger_code VARCHAR(32) NOT NULL\n CHECK (baseline_trigger_code IN ('entry', 'exit', 'gate', 'handoff', 'approval', 'manual')),\n\n -- baseline 이름\n baseline_name VARCHAR(256) NOT NULL,\n\n -- baseline 설명\n baseline_description TEXT,\n\n -- 필수 여부\n is_required INTEGER NOT NULL DEFAULT 1\n CHECK (is_required IN (0, 1)),\n\n -- validation 필수 여부\n validation_required INTEGER NOT NULL DEFAULT 0\n CHECK (validation_required IN (0, 1)),\n\n -- 정렬 순서\n sort_order INTEGER NOT NULL DEFAULT 0,\n\n -- 생성 시각\n created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 수정 시각\n updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 확장 메타데이터\n metadata_json JSON\n CHECK (metadata_json IS NULL OR json_valid(metadata_json))\n)"
3793
+ },
3794
+ {
3795
+ "name": "methodology_trace_policies",
3796
+ "type": "table",
3797
+ "comment": "실제 trace link가 아니라 trace 필요 관계 정책을 관리한다.",
3798
+ "columns": [
3799
+ {
3800
+ "name": "trace_policy_id",
3801
+ "type": "CHAR(36)",
3802
+ "nullable": true
3803
+ },
3804
+ {
3805
+ "name": "policy_scope_code",
3806
+ "type": "VARCHAR(32)",
3807
+ "nullable": false
3808
+ },
3809
+ {
3810
+ "name": "policy_scope_ref_id",
3811
+ "type": "CHAR(36)",
3812
+ "nullable": false
3813
+ },
3814
+ {
3815
+ "name": "source_scope_code",
3816
+ "type": "VARCHAR(64)",
3817
+ "nullable": false
3818
+ },
3819
+ {
3820
+ "name": "target_scope_code",
3821
+ "type": "VARCHAR(64)",
3822
+ "nullable": false
3823
+ },
3824
+ {
3825
+ "name": "trace_type_code",
3826
+ "type": "VARCHAR(32)",
3827
+ "nullable": false
3828
+ },
3829
+ {
3830
+ "name": "policy_name",
3831
+ "type": "VARCHAR(256)",
3832
+ "nullable": false
3833
+ },
3834
+ {
3835
+ "name": "policy_description",
3836
+ "type": "TEXT",
3837
+ "nullable": true
3838
+ },
3839
+ {
3840
+ "name": "is_required",
3841
+ "type": "INTEGER",
3842
+ "nullable": false,
3843
+ "default": "1"
3844
+ },
3845
+ {
3846
+ "name": "validation_required",
3847
+ "type": "INTEGER",
3848
+ "nullable": false,
3849
+ "default": "0"
3850
+ },
3851
+ {
3852
+ "name": "severity_code",
3853
+ "type": "VARCHAR(32)",
3854
+ "nullable": false,
3855
+ "default": "'error'"
3856
+ },
3857
+ {
3858
+ "name": "sort_order",
3859
+ "type": "INTEGER",
3860
+ "nullable": false,
3861
+ "default": "0"
3862
+ },
3863
+ {
3864
+ "name": "created_at",
3865
+ "type": "DATETIME",
3866
+ "nullable": false,
3867
+ "default": "CURRENT_TIMESTAMP"
3868
+ },
3869
+ {
3870
+ "name": "updated_at",
3871
+ "type": "DATETIME",
3872
+ "nullable": false,
3873
+ "default": "CURRENT_TIMESTAMP"
3874
+ },
3875
+ {
3876
+ "name": "metadata_json",
3877
+ "type": "JSON",
3878
+ "nullable": true
3879
+ }
3880
+ ],
3881
+ "indexes": [
3882
+ {
3883
+ "name": "idx_methodology_trace_policies_policy_scope",
3884
+ "def": "CREATE INDEX idx_methodology_trace_policies_policy_scope\n ON methodology_trace_policies (policy_scope_code, policy_scope_ref_id)",
3885
+ "table": "methodology_trace_policies",
3886
+ "columns": [
3887
+ "policy_scope_code",
3888
+ "policy_scope_ref_id"
3889
+ ]
3890
+ },
3891
+ {
3892
+ "name": "sqlite_autoindex_methodology_trace_policies_1",
3893
+ "def": "PRIMARY KEY (trace_policy_id)",
3894
+ "table": "methodology_trace_policies",
3895
+ "columns": [
3896
+ "trace_policy_id"
3897
+ ]
3898
+ }
3899
+ ],
3900
+ "constraints": [
3901
+ {
3902
+ "name": "trace_policy_id",
3903
+ "type": "PRIMARY KEY",
3904
+ "def": "PRIMARY KEY (trace_policy_id)",
3905
+ "table": "methodology_trace_policies",
3906
+ "columns": [
3907
+ "trace_policy_id"
3908
+ ]
3909
+ },
3910
+ {
3911
+ "name": "sqlite_autoindex_methodology_trace_policies_1",
3912
+ "type": "PRIMARY KEY",
3913
+ "def": "PRIMARY KEY (trace_policy_id)",
3914
+ "table": "methodology_trace_policies",
3915
+ "columns": [
3916
+ "trace_policy_id"
3917
+ ]
3918
+ },
3919
+ {
3920
+ "name": "-",
3921
+ "type": "CHECK",
3922
+ "def": "CHECK (length(trace_policy_id) = 36)",
3923
+ "table": "methodology_trace_policies",
3924
+ "columns": [
3925
+ "trace_policy_id"
3926
+ ]
3927
+ },
3928
+ {
3929
+ "name": "-",
3930
+ "type": "CHECK",
3931
+ "def": "CHECK (policy_scope_code IN ('methodology', 'lifecycle', 'phase', 'process', 'stage', 'activity'))",
3932
+ "table": "methodology_trace_policies",
3933
+ "columns": [
3934
+ "policy_scope_code"
3935
+ ]
3936
+ },
3937
+ {
3938
+ "name": "-",
3939
+ "type": "CHECK",
3940
+ "def": "CHECK (length(policy_scope_ref_id) = 36)",
3941
+ "table": "methodology_trace_policies",
3942
+ "columns": [
3943
+ "policy_scope_ref_id"
3944
+ ]
3945
+ },
3946
+ {
3947
+ "name": "-",
3948
+ "type": "CHECK",
3949
+ "def": "CHECK (source_scope_code IN ('phase', 'process', 'stage', 'activity', 'artifact_requirement', 'artifact_standard'))",
3950
+ "table": "methodology_trace_policies",
3951
+ "columns": [
3952
+ "source_scope_code"
3953
+ ]
3954
+ },
3955
+ {
3956
+ "name": "-",
3957
+ "type": "CHECK",
3958
+ "def": "CHECK (target_scope_code IN ('phase', 'process', 'stage', 'activity', 'artifact_requirement', 'artifact_standard'))",
3959
+ "table": "methodology_trace_policies",
3960
+ "columns": [
3961
+ "target_scope_code"
3962
+ ]
3963
+ },
3964
+ {
3965
+ "name": "-",
3966
+ "type": "CHECK",
3967
+ "def": "CHECK (trace_type_code IN ('derives', 'produces', 'consumes', 'validates', 'hands_off', 'refines', 'impacts'))",
3968
+ "table": "methodology_trace_policies",
3969
+ "columns": [
3970
+ "trace_type_code"
3971
+ ]
3972
+ },
3973
+ {
3974
+ "name": "-",
3975
+ "type": "CHECK",
3976
+ "def": "CHECK (is_required IN (0, 1))",
3977
+ "table": "methodology_trace_policies",
3978
+ "columns": [
3979
+ "is_required"
3980
+ ]
3981
+ },
3982
+ {
3983
+ "name": "-",
3984
+ "type": "CHECK",
3985
+ "def": "CHECK (validation_required IN (0, 1))",
3986
+ "table": "methodology_trace_policies",
3987
+ "columns": [
3988
+ "validation_required"
3989
+ ]
3990
+ },
3991
+ {
3992
+ "name": "-",
3993
+ "type": "CHECK",
3994
+ "def": "CHECK (severity_code IN ('info', 'warning', 'error', 'critical'))",
3995
+ "table": "methodology_trace_policies",
3996
+ "columns": [
3997
+ "severity_code"
3998
+ ]
3999
+ },
4000
+ {
4001
+ "name": "-",
4002
+ "type": "CHECK",
4003
+ "def": "CHECK (metadata_json IS NULL OR json_valid(metadata_json))",
4004
+ "table": "methodology_trace_policies",
4005
+ "columns": [
4006
+ "metadata_json"
4007
+ ]
4008
+ }
4009
+ ],
4010
+ "def": "CREATE TABLE methodology_trace_policies (\n -- trace policy 식별자\n trace_policy_id CHAR(36) PRIMARY KEY\n CHECK (length(trace_policy_id) = 36),\n\n -- policy 적용 scope 코드\n policy_scope_code VARCHAR(32) NOT NULL\n CHECK (policy_scope_code IN ('methodology', 'lifecycle', 'phase', 'process', 'stage', 'activity')),\n\n -- policy 적용 scope 참조 식별자\n policy_scope_ref_id CHAR(36) NOT NULL\n CHECK (length(policy_scope_ref_id) = 36),\n\n -- trace source scope 코드\n source_scope_code VARCHAR(64) NOT NULL\n CHECK (source_scope_code IN ('phase', 'process', 'stage', 'activity', 'artifact_requirement', 'artifact_standard')),\n\n -- trace target scope 코드\n target_scope_code VARCHAR(64) NOT NULL\n CHECK (target_scope_code IN ('phase', 'process', 'stage', 'activity', 'artifact_requirement', 'artifact_standard')),\n\n -- trace 유형 코드\n trace_type_code VARCHAR(32) NOT NULL\n CHECK (trace_type_code IN ('derives', 'produces', 'consumes', 'validates', 'hands_off', 'refines', 'impacts')),\n\n -- policy 이름\n policy_name VARCHAR(256) NOT NULL,\n\n -- policy 설명\n policy_description TEXT,\n\n -- 필수 여부\n is_required INTEGER NOT NULL DEFAULT 1\n CHECK (is_required IN (0, 1)),\n\n -- validation 필수 여부\n validation_required INTEGER NOT NULL DEFAULT 0\n CHECK (validation_required IN (0, 1)),\n\n -- 심각도 코드\n severity_code VARCHAR(32) NOT NULL DEFAULT 'error'\n CHECK (severity_code IN ('info', 'warning', 'error', 'critical')),\n\n -- 정렬 순서\n sort_order INTEGER NOT NULL DEFAULT 0,\n\n -- 생성 시각\n created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 수정 시각\n updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n\n -- 확장 메타데이터\n metadata_json JSON\n CHECK (metadata_json IS NULL OR json_valid(metadata_json))\n)"
4011
+ }
4012
+ ],
4013
+ "relations": [
4014
+ {
4015
+ "table": "methodology_codes",
4016
+ "columns": [
4017
+ "code_group_code"
4018
+ ],
4019
+ "cardinality": "zero_or_one",
4020
+ "parent_table": "methodology_code_groups",
4021
+ "parent_columns": [
4022
+ "code_group_code"
4023
+ ],
4024
+ "parent_cardinality": "exactly_one",
4025
+ "def": "FOREIGN KEY (code_group_code) REFERENCES methodology_code_groups (code_group_code) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
4026
+ },
4027
+ {
4028
+ "table": "methodology_common_blueprint_policies",
4029
+ "columns": [
4030
+ "methodology_id"
4031
+ ],
4032
+ "cardinality": "zero_or_more",
4033
+ "parent_table": "methodology_methodologies",
4034
+ "parent_columns": [
4035
+ "methodology_id"
4036
+ ],
4037
+ "parent_cardinality": "exactly_one",
4038
+ "def": "FOREIGN KEY (methodology_id) REFERENCES methodology_methodologies (methodology_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
4039
+ },
4040
+ {
4041
+ "table": "methodology_common_blueprint_policy_nodes",
4042
+ "columns": [
4043
+ "parent_policy_node_id"
4044
+ ],
4045
+ "cardinality": "zero_or_more",
4046
+ "parent_table": "methodology_common_blueprint_policy_nodes",
4047
+ "parent_columns": [
4048
+ "common_blueprint_policy_node_id"
4049
+ ],
4050
+ "parent_cardinality": "zero_or_one",
4051
+ "def": "FOREIGN KEY (parent_policy_node_id) REFERENCES methodology_common_blueprint_policy_nodes (common_blueprint_policy_node_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
4052
+ },
4053
+ {
4054
+ "table": "methodology_common_blueprint_policy_nodes",
4055
+ "columns": [
4056
+ "common_blueprint_policy_id"
4057
+ ],
4058
+ "cardinality": "zero_or_more",
4059
+ "parent_table": "methodology_common_blueprint_policies",
4060
+ "parent_columns": [
4061
+ "common_blueprint_policy_id"
4062
+ ],
4063
+ "parent_cardinality": "exactly_one",
4064
+ "def": "FOREIGN KEY (common_blueprint_policy_id) REFERENCES methodology_common_blueprint_policies (common_blueprint_policy_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
4065
+ },
4066
+ {
4067
+ "table": "methodology_lifecycles",
4068
+ "columns": [
4069
+ "methodology_id"
4070
+ ],
4071
+ "cardinality": "zero_or_more",
4072
+ "parent_table": "methodology_methodologies",
4073
+ "parent_columns": [
4074
+ "methodology_id"
4075
+ ],
4076
+ "parent_cardinality": "exactly_one",
4077
+ "def": "FOREIGN KEY (methodology_id) REFERENCES methodology_methodologies (methodology_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
4078
+ },
4079
+ {
4080
+ "table": "methodology_phases",
4081
+ "columns": [
4082
+ "lifecycle_id"
4083
+ ],
4084
+ "cardinality": "zero_or_more",
4085
+ "parent_table": "methodology_lifecycles",
4086
+ "parent_columns": [
4087
+ "lifecycle_id"
4088
+ ],
4089
+ "parent_cardinality": "exactly_one",
4090
+ "def": "FOREIGN KEY (lifecycle_id) REFERENCES methodology_lifecycles (lifecycle_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
4091
+ },
4092
+ {
4093
+ "table": "methodology_processes",
4094
+ "columns": [
4095
+ "methodology_id"
4096
+ ],
4097
+ "cardinality": "zero_or_more",
4098
+ "parent_table": "methodology_methodologies",
4099
+ "parent_columns": [
4100
+ "methodology_id"
4101
+ ],
4102
+ "parent_cardinality": "exactly_one",
4103
+ "def": "FOREIGN KEY (methodology_id) REFERENCES methodology_methodologies (methodology_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
4104
+ },
4105
+ {
4106
+ "table": "methodology_phase_processes",
4107
+ "columns": [
4108
+ "process_id"
4109
+ ],
4110
+ "cardinality": "zero_or_more",
4111
+ "parent_table": "methodology_processes",
4112
+ "parent_columns": [
4113
+ "process_id"
4114
+ ],
4115
+ "parent_cardinality": "exactly_one",
4116
+ "def": "FOREIGN KEY (process_id) REFERENCES methodology_processes (process_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
4117
+ },
4118
+ {
4119
+ "table": "methodology_phase_processes",
4120
+ "columns": [
4121
+ "phase_id"
4122
+ ],
4123
+ "cardinality": "zero_or_more",
4124
+ "parent_table": "methodology_phases",
4125
+ "parent_columns": [
4126
+ "phase_id"
4127
+ ],
4128
+ "parent_cardinality": "exactly_one",
4129
+ "def": "FOREIGN KEY (phase_id) REFERENCES methodology_phases (phase_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
4130
+ },
4131
+ {
4132
+ "table": "methodology_activities",
4133
+ "columns": [
4134
+ "process_id"
4135
+ ],
4136
+ "cardinality": "zero_or_more",
4137
+ "parent_table": "methodology_processes",
4138
+ "parent_columns": [
4139
+ "process_id"
4140
+ ],
4141
+ "parent_cardinality": "exactly_one",
4142
+ "def": "FOREIGN KEY (process_id) REFERENCES methodology_processes (process_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
4143
+ },
4144
+ {
4145
+ "table": "methodology_steps",
4146
+ "columns": [
4147
+ "activity_id"
4148
+ ],
4149
+ "cardinality": "zero_or_more",
4150
+ "parent_table": "methodology_activities",
4151
+ "parent_columns": [
4152
+ "activity_id"
4153
+ ],
4154
+ "parent_cardinality": "exactly_one",
4155
+ "def": "FOREIGN KEY (activity_id) REFERENCES methodology_activities (activity_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
4156
+ },
4157
+ {
4158
+ "table": "methodology_stages",
4159
+ "columns": [
4160
+ "process_id"
4161
+ ],
4162
+ "cardinality": "zero_or_more",
4163
+ "parent_table": "methodology_processes",
4164
+ "parent_columns": [
4165
+ "process_id"
4166
+ ],
4167
+ "parent_cardinality": "exactly_one",
4168
+ "def": "FOREIGN KEY (process_id) REFERENCES methodology_processes (process_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
4169
+ },
4170
+ {
4171
+ "table": "methodology_stage_activities",
4172
+ "columns": [
4173
+ "activity_id"
4174
+ ],
4175
+ "cardinality": "zero_or_more",
4176
+ "parent_table": "methodology_activities",
4177
+ "parent_columns": [
4178
+ "activity_id"
4179
+ ],
4180
+ "parent_cardinality": "exactly_one",
4181
+ "def": "FOREIGN KEY (activity_id) REFERENCES methodology_activities (activity_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
4182
+ },
4183
+ {
4184
+ "table": "methodology_stage_activities",
4185
+ "columns": [
4186
+ "stage_id"
4187
+ ],
4188
+ "cardinality": "zero_or_more",
4189
+ "parent_table": "methodology_stages",
4190
+ "parent_columns": [
4191
+ "stage_id"
4192
+ ],
4193
+ "parent_cardinality": "exactly_one",
4194
+ "def": "FOREIGN KEY (stage_id) REFERENCES methodology_stages (stage_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
4195
+ },
4196
+ {
4197
+ "table": "methodology_activity_artifact_requirements",
4198
+ "columns": [
4199
+ "activity_id"
4200
+ ],
4201
+ "cardinality": "zero_or_more",
4202
+ "parent_table": "methodology_activities",
4203
+ "parent_columns": [
4204
+ "activity_id"
4205
+ ],
4206
+ "parent_cardinality": "exactly_one",
4207
+ "def": "FOREIGN KEY (activity_id) REFERENCES methodology_activities (activity_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
4208
+ },
4209
+ {
4210
+ "table": "methodology_stage_artifact_requirements",
4211
+ "columns": [
4212
+ "stage_id"
4213
+ ],
4214
+ "cardinality": "zero_or_more",
4215
+ "parent_table": "methodology_stages",
4216
+ "parent_columns": [
4217
+ "stage_id"
4218
+ ],
4219
+ "parent_cardinality": "exactly_one",
4220
+ "def": "FOREIGN KEY (stage_id) REFERENCES methodology_stages (stage_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
4221
+ },
4222
+ {
4223
+ "table": "methodology_stage_criteria",
4224
+ "columns": [
4225
+ "stage_id"
4226
+ ],
4227
+ "cardinality": "zero_or_more",
4228
+ "parent_table": "methodology_stages",
4229
+ "parent_columns": [
4230
+ "stage_id"
4231
+ ],
4232
+ "parent_cardinality": "exactly_one",
4233
+ "def": "FOREIGN KEY (stage_id) REFERENCES methodology_stages (stage_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
4234
+ },
4235
+ {
4236
+ "table": "methodology_activity_criteria",
4237
+ "columns": [
4238
+ "activity_id"
4239
+ ],
4240
+ "cardinality": "zero_or_more",
4241
+ "parent_table": "methodology_activities",
4242
+ "parent_columns": [
4243
+ "activity_id"
4244
+ ],
4245
+ "parent_cardinality": "exactly_one",
4246
+ "def": "FOREIGN KEY (activity_id) REFERENCES methodology_activities (activity_id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
4247
+ }
4248
+ ],
4249
+ "driver": {
4250
+ "name": "sqlite",
4251
+ "database_version": "3.51.3"
4252
+ }
4253
+ }