@mcptoolshop/style-dataset-lab 1.2.1 → 2.1.0

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 (62) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/README.md +138 -113
  3. package/bin/sdlab.js +126 -0
  4. package/lib/args.js +106 -0
  5. package/lib/card.js +145 -0
  6. package/lib/comfyui.js +109 -0
  7. package/lib/config.js +248 -0
  8. package/lib/deprecation.js +14 -0
  9. package/lib/eligibility.js +110 -0
  10. package/lib/eval-pack.js +283 -0
  11. package/lib/export.js +259 -0
  12. package/lib/paths.js +38 -0
  13. package/lib/records.js +69 -0
  14. package/lib/snapshot.js +211 -0
  15. package/lib/split.js +409 -0
  16. package/package.json +20 -9
  17. package/scripts/bulk-curate-wave2-5.js +1 -1
  18. package/scripts/bulk-curate-waves11-18.js +1 -1
  19. package/scripts/canon-bind.js +188 -338
  20. package/scripts/card.js +73 -0
  21. package/scripts/compare.js +40 -30
  22. package/scripts/curate-wave25.js +1 -1
  23. package/scripts/curate.js +34 -28
  24. package/scripts/doctor.js +324 -0
  25. package/scripts/eligibility.js +91 -0
  26. package/scripts/eval-pack.js +92 -0
  27. package/scripts/export.js +85 -0
  28. package/scripts/generate-controlnet.js +36 -121
  29. package/scripts/generate-identity.js +38 -106
  30. package/scripts/generate-ipadapter.js +42 -119
  31. package/scripts/generate.js +22 -81
  32. package/scripts/init.js +229 -0
  33. package/scripts/migrate-records.js +15 -21
  34. package/scripts/painterly-test.js +20 -47
  35. package/scripts/painterly.js +27 -106
  36. package/scripts/snapshot.js +132 -0
  37. package/scripts/split.js +154 -0
  38. package/templates/domains/architecture/constitution.json +97 -0
  39. package/templates/domains/architecture/lanes.json +41 -0
  40. package/templates/domains/architecture/project.json +20 -0
  41. package/templates/domains/architecture/rubric.json +40 -0
  42. package/templates/domains/architecture/terminology.json +19 -0
  43. package/templates/domains/character-design/constitution.json +88 -0
  44. package/templates/domains/character-design/lanes.json +35 -0
  45. package/templates/domains/character-design/project.json +17 -0
  46. package/templates/domains/character-design/rubric.json +38 -0
  47. package/templates/domains/character-design/terminology.json +21 -0
  48. package/templates/domains/creature-design/constitution.json +87 -0
  49. package/templates/domains/creature-design/lanes.json +41 -0
  50. package/templates/domains/creature-design/project.json +18 -0
  51. package/templates/domains/creature-design/rubric.json +39 -0
  52. package/templates/domains/creature-design/terminology.json +20 -0
  53. package/templates/domains/game-art/constitution.json +113 -0
  54. package/templates/domains/game-art/lanes.json +47 -0
  55. package/templates/domains/game-art/project.json +17 -0
  56. package/templates/domains/game-art/rubric.json +36 -0
  57. package/templates/domains/game-art/terminology.json +30 -0
  58. package/templates/domains/vehicle-mech/constitution.json +87 -0
  59. package/templates/domains/vehicle-mech/lanes.json +41 -0
  60. package/templates/domains/vehicle-mech/project.json +17 -0
  61. package/templates/domains/vehicle-mech/rubric.json +40 -0
  62. package/templates/domains/vehicle-mech/terminology.json +21 -0
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "architecture",
3
+ "display_name": "Architecture",
4
+ "domain": "architecture",
5
+ "version": "1.0.0",
6
+ "description": "Architectural and worldbuilding concept art — building exteriors, interiors, streetscapes, structural details, ruins, and landscapes for film, game, and themed entertainment pre-visualization.",
7
+ "defaults": {
8
+ "checkpoint": "dreamshaperXL_v21TurboDPMSDE.safetensors",
9
+ "loras": [
10
+ { "name": "classipeintxl_v21.safetensors", "weight": 1.0 }
11
+ ],
12
+ "width": 1024,
13
+ "height": 1024,
14
+ "steps": 8,
15
+ "cfg": 2.0,
16
+ "sampler": "dpmpp_sde",
17
+ "scheduler": "karras",
18
+ "comfy_url": "http://127.0.0.1:8188"
19
+ }
20
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "dimensions": [
3
+ "structural_plausibility",
4
+ "material_consistency",
5
+ "perspective_accuracy",
6
+ "lighting_mood",
7
+ "scale_consistency",
8
+ "era_coherence",
9
+ "weathering_logic",
10
+ "style_consistency",
11
+ "detail_density",
12
+ "ruin_logic"
13
+ ],
14
+ "thresholds": {
15
+ "approved": {
16
+ "pass": 0.7,
17
+ "partial": 0.5
18
+ },
19
+ "borderline": {
20
+ "pass": 0.7,
21
+ "partial": 0.5
22
+ },
23
+ "rejected": {
24
+ "fail_ceiling": 0.4,
25
+ "partial_ceiling": 0.6
26
+ }
27
+ },
28
+ "failure_to_rules": {
29
+ "impossible_structure": ["STR-001"],
30
+ "wrong_material": ["MAT-001"],
31
+ "bad_perspective": ["PER-001"],
32
+ "anachronism": ["ERA-001"],
33
+ "flat_lighting": ["LGT-001"],
34
+ "scale_mismatch": ["SCL-001"],
35
+ "illogical_weathering": ["WEA-001"],
36
+ "style_break": ["STY-001"],
37
+ "detail_mismatch": ["DET-001"],
38
+ "arbitrary_decay": ["RUI-001"]
39
+ }
40
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "group_label": "style_period",
3
+ "id_detection_order": [],
4
+ "prompt_detection_order": [],
5
+ "groups": {},
6
+ "cross_group_patterns": {},
7
+ "edge_defaults": {},
8
+ "null_faction_patterns": [],
9
+ "id_fallbacks": {},
10
+ "faction_context": {},
11
+ "training_profiles": {
12
+ "profile_id": "architecture-style",
13
+ "intended_use": "Architectural style LoRA for consistent worldbuilding",
14
+ "eligible_lanes": ["exterior", "interior", "streetscape"],
15
+ "minimum_review_threshold": 0.7,
16
+ "excluded_content": ["rejected"],
17
+ "export_format": "trl"
18
+ }
19
+ }
@@ -0,0 +1,88 @@
1
+ {
2
+ "version": "1.0.0",
3
+ "rules": [
4
+ {
5
+ "id": "PRO-001",
6
+ "category": "proportion",
7
+ "desc": "Anatomical proportion accuracy — limb length, joint placement, mass distribution",
8
+ "dims": ["proportion_accuracy"],
9
+ "rationale_pass": "Proportions are anatomically sound — limbs, joints, and mass read correctly (${scorePct}%)",
10
+ "rationale_fail": "Proportion errors — limb length, joint placement, or mass distribution incorrect (${scorePct}%)"
11
+ },
12
+ {
13
+ "id": "PRO-002",
14
+ "category": "proportion",
15
+ "desc": "Consistent head-to-body ratio across all views and poses",
16
+ "dims": ["proportion_accuracy"],
17
+ "rationale_pass": "Head-to-body ratio is consistent across views (${scorePct}%)",
18
+ "rationale_fail": "Head-to-body ratio drifts between views — character reads as different heights (${scorePct}%)"
19
+ },
20
+ {
21
+ "id": "GES-001",
22
+ "category": "gesture",
23
+ "desc": "Gesture clarity — pose communicates intent, weight, and emotion",
24
+ "dims": ["gesture_clarity"],
25
+ "rationale_pass": "Gesture reads clearly — pose communicates intent and weight (${scorePct}%)",
26
+ "rationale_fail": "Gesture is stiff or ambiguous — pose does not communicate intent (${scorePct}%)"
27
+ },
28
+ {
29
+ "id": "COS-001",
30
+ "category": "costume",
31
+ "desc": "Costume logic — layers make functional sense, nothing floats or clips irrationally",
32
+ "dims": ["costume_logic"],
33
+ "rationale_pass": "Costume logic holds — layers are functional and physically plausible (${scorePct}%)",
34
+ "rationale_fail": "Costume logic broken — floating elements, impossible layers, or nonsensical construction (${scorePct}%)"
35
+ },
36
+ {
37
+ "id": "COS-002",
38
+ "category": "costume",
39
+ "desc": "Costume consistency across poses and views — same garments, same details",
40
+ "dims": ["costume_logic", "style_consistency"],
41
+ "rationale_pass": "Costume is consistent across poses and views — details match (${scorePct}%)",
42
+ "rationale_fail": "Costume changes between views — missing details, altered garments, or inconsistent accessories (${scorePct}%)"
43
+ },
44
+ {
45
+ "id": "PER-001",
46
+ "category": "personality",
47
+ "desc": "Personality read — character is recognizable by silhouette alone",
48
+ "dims": ["personality_read"],
49
+ "rationale_pass": "Character reads at silhouette level — distinct and recognizable (${scorePct}%)",
50
+ "rationale_fail": "Character is generic — silhouette is not distinctive or recognizable (${scorePct}%)"
51
+ },
52
+ {
53
+ "id": "STY-001",
54
+ "category": "style",
55
+ "desc": "Style consistency across the project — rendering, line quality, color treatment match",
56
+ "dims": ["style_consistency"],
57
+ "rationale_pass": "Style is consistent with the project — rendering and color treatment match (${scorePct}%)",
58
+ "rationale_fail": "Style drifts from project standard — rendering or color treatment inconsistent (${scorePct}%)"
59
+ },
60
+ {
61
+ "id": "TUR-001",
62
+ "category": "turnaround",
63
+ "desc": "Turnaround accuracy — same character from all angles, proportions hold in rotation",
64
+ "dims": ["turnaround_accuracy"],
65
+ "lanes": ["turnaround"],
66
+ "rationale_pass": "Turnaround is accurate — character holds across all rotation angles (${scorePct}%)",
67
+ "rationale_fail": "Turnaround breaks — proportions, costume, or features change between angles (${scorePct}%)"
68
+ },
69
+ {
70
+ "id": "EXP-001",
71
+ "category": "expression",
72
+ "desc": "Expression range — emotions read clearly and the face stays on-model",
73
+ "dims": ["expression_clarity"],
74
+ "lanes": ["expression_sheet"],
75
+ "rationale_pass": "Expressions read clearly — face stays on-model across emotions (${scorePct}%)",
76
+ "rationale_fail": "Expressions are muddy or off-model — emotions do not read clearly (${scorePct}%)"
77
+ },
78
+ {
79
+ "id": "ACT-001",
80
+ "category": "action",
81
+ "desc": "Action readability — dynamic poses have clear silhouette and readable motion",
82
+ "dims": ["gesture_clarity", "silhouette_read"],
83
+ "lanes": ["action_pose"],
84
+ "rationale_pass": "Action reads clearly — silhouette and motion are unambiguous (${scorePct}%)",
85
+ "rationale_fail": "Action is unreadable — tangled limbs, unclear silhouette, or static feel (${scorePct}%)"
86
+ }
87
+ ]
88
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "default_lane": "full_body",
3
+ "lanes": [
4
+ {
5
+ "id": "portrait",
6
+ "label": "Portrait / Headshot",
7
+ "description": "Head and shoulders — face detail, expression, hair, accessories",
8
+ "id_patterns": ["^portrait_", "^head_", "^face_"]
9
+ },
10
+ {
11
+ "id": "full_body",
12
+ "label": "Full Body",
13
+ "description": "Full figure standing pose — proportions, costume, silhouette",
14
+ "id_patterns": ["^full_", "^body_", "^standing_"]
15
+ },
16
+ {
17
+ "id": "turnaround",
18
+ "label": "Turnaround / Orthographic",
19
+ "description": "Multi-angle orthographic views — front, side, back, three-quarter",
20
+ "id_patterns": ["^turn_", "^ortho_", "^rotation_"]
21
+ },
22
+ {
23
+ "id": "expression_sheet",
24
+ "label": "Expression Sheet",
25
+ "description": "Emotion range grid — consistent face across multiple expressions",
26
+ "id_patterns": ["^expr_", "^emotion_", "^face_sheet_"]
27
+ },
28
+ {
29
+ "id": "action_pose",
30
+ "label": "Action Pose",
31
+ "description": "Dynamic poses — combat, movement, gesture-driven character moments",
32
+ "id_patterns": ["^action_", "^pose_", "^dynamic_"]
33
+ }
34
+ ]
35
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "TEMPLATE",
3
+ "display_name": "TEMPLATE",
4
+ "domain": "character-design",
5
+ "version": "0.1.0",
6
+ "defaults": {
7
+ "checkpoint": "",
8
+ "loras": [],
9
+ "width": 1024,
10
+ "height": 1024,
11
+ "steps": 8,
12
+ "cfg": 2.0,
13
+ "sampler": "dpmpp_sde",
14
+ "scheduler": "karras",
15
+ "comfy_url": "http://127.0.0.1:8188"
16
+ }
17
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "dimensions": [
3
+ "proportion_accuracy",
4
+ "gesture_clarity",
5
+ "costume_logic",
6
+ "personality_read",
7
+ "style_consistency",
8
+ "silhouette_read",
9
+ "turnaround_accuracy",
10
+ "expression_clarity"
11
+ ],
12
+ "thresholds": {
13
+ "approved": {
14
+ "pass": 0.7,
15
+ "partial": 0.5
16
+ },
17
+ "borderline": {
18
+ "pass": 0.7,
19
+ "partial": 0.5
20
+ },
21
+ "rejected": {
22
+ "fail_ceiling": 0.4,
23
+ "partial_ceiling": 0.6
24
+ }
25
+ },
26
+ "failure_to_rules": {
27
+ "broken_anatomy": ["PRO-001"],
28
+ "stiff_pose": ["GES-001"],
29
+ "generic_costume": ["COS-001"],
30
+ "unrecognizable": ["PER-001"],
31
+ "inconsistent_costume": ["COS-002"],
32
+ "style_drift": ["STY-001"],
33
+ "turnaround_mismatch": ["TUR-001"],
34
+ "flat_expressions": ["EXP-001"],
35
+ "unreadable_action": ["ACT-001"],
36
+ "proportion_drift": ["PRO-002"]
37
+ }
38
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "group_label": "style_family",
3
+ "id_detection_order": [],
4
+ "prompt_detection_order": [],
5
+ "groups": {},
6
+ "cross_group_patterns": {},
7
+ "edge_defaults": {},
8
+ "null_faction_patterns": [],
9
+ "id_fallbacks": {},
10
+ "faction_context": {},
11
+ "training_profiles": [
12
+ {
13
+ "profile_id": "character-style",
14
+ "intended_use": "Character style consistency LoRA",
15
+ "eligible_lanes": ["portrait", "full_body", "turnaround"],
16
+ "minimum_review_threshold": 0.7,
17
+ "excluded_content": ["rejected"],
18
+ "export_format": "trl"
19
+ }
20
+ ]
21
+ }
@@ -0,0 +1,87 @@
1
+ {
2
+ "version": "1.0.0",
3
+ "rules": [
4
+ {
5
+ "id": "ANA-001",
6
+ "category": "anatomy",
7
+ "desc": "Anatomical plausibility — skeletal and muscular structure supports locomotion and body mass",
8
+ "dims": ["anatomy_accuracy"],
9
+ "rationale_pass": "Anatomy is plausible — structure supports locomotion and mass (${scorePct}%)",
10
+ "rationale_fail": "Anatomy implausible — structure cannot support locomotion or body mass (${scorePct}%)"
11
+ },
12
+ {
13
+ "id": "ANA-002",
14
+ "category": "anatomy",
15
+ "desc": "Consistent anatomy across all views and poses — proportions, joint placement, and limb count stable",
16
+ "dims": ["anatomy_accuracy"],
17
+ "rationale_pass": "Anatomy consistent across views — proportions and joints stable (${scorePct}%)",
18
+ "rationale_fail": "Anatomy inconsistent — proportions or joints shift between views (${scorePct}%)"
19
+ },
20
+ {
21
+ "id": "SIL-001",
22
+ "category": "silhouette",
23
+ "desc": "Silhouette distinction — creature identifiable by outline alone at reduced scale",
24
+ "dims": ["silhouette_distinction"],
25
+ "rationale_pass": "Silhouette distinctive — creature readable by outline alone (${scorePct}%)",
26
+ "rationale_fail": "Silhouette generic — creature not identifiable by outline (${scorePct}%)"
27
+ },
28
+ {
29
+ "id": "SUR-001",
30
+ "category": "surface",
31
+ "desc": "Surface and texture consistency — skin, scales, fur, chitin, or other covering is coherent across the body",
32
+ "dims": ["surface_texture"],
33
+ "rationale_pass": "Surface texture coherent — covering reads consistently across the body (${scorePct}%)",
34
+ "rationale_fail": "Surface texture inconsistent — covering changes illogically across the body (${scorePct}%)"
35
+ },
36
+ {
37
+ "id": "EVO-001",
38
+ "category": "ecology",
39
+ "desc": "Evolutionary logic — adaptations serve ecological function, not purely decorative",
40
+ "dims": ["evolutionary_logic"],
41
+ "rationale_pass": "Adaptations make ecological sense — form follows function (${scorePct}%)",
42
+ "rationale_fail": "Adaptations lack ecological logic — features are purely decorative (${scorePct}%)"
43
+ },
44
+ {
45
+ "id": "SCL-001",
46
+ "category": "scale",
47
+ "desc": "Scale reference present and readable — creature size clear relative to known objects or figures",
48
+ "dims": ["scale_accuracy"],
49
+ "lanes": ["scale_reference"],
50
+ "rationale_pass": "Scale reference clear — creature size readable against reference (${scorePct}%)",
51
+ "rationale_fail": "Scale reference missing or unreadable — creature size ambiguous (${scorePct}%)"
52
+ },
53
+ {
54
+ "id": "LOC-001",
55
+ "category": "locomotion",
56
+ "desc": "Locomotion class reads clearly — biped, quadruped, flying, aquatic, serpentine, or hybrid",
57
+ "dims": ["locomotion_read"],
58
+ "rationale_pass": "Locomotion class clear — movement mode reads from anatomy (${scorePct}%)",
59
+ "rationale_fail": "Locomotion class unclear — cannot determine how creature moves (${scorePct}%)"
60
+ },
61
+ {
62
+ "id": "BEH-001",
63
+ "category": "behavior",
64
+ "desc": "Behavioral cues present in pose, expression, or body language — predator, prey, social, solitary",
65
+ "dims": ["behavioral_read"],
66
+ "rationale_pass": "Behavioral cues present — temperament reads from pose and expression (${scorePct}%)",
67
+ "rationale_fail": "Behavioral cues absent — creature pose is neutral and uninformative (${scorePct}%)"
68
+ },
69
+ {
70
+ "id": "STY-001",
71
+ "category": "style",
72
+ "desc": "Style consistency across species or creature lineup — rendering, detail level, and design language match",
73
+ "dims": ["style_consistency"],
74
+ "rationale_pass": "Style consistent — creature fits the lineup's design language (${scorePct}%)",
75
+ "rationale_fail": "Style inconsistent — creature looks like it belongs to a different project (${scorePct}%)"
76
+ },
77
+ {
78
+ "id": "HAB-001",
79
+ "category": "habitat",
80
+ "desc": "Habitat integration — creature anatomy and coloring fit the environment context",
81
+ "dims": ["habitat_fit"],
82
+ "lanes": ["habitat"],
83
+ "rationale_pass": "Habitat integration reads — creature fits its environment context (${scorePct}%)",
84
+ "rationale_fail": "Habitat mismatch — creature does not fit the environment context (${scorePct}%)"
85
+ }
86
+ ]
87
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "default_lane": "concept",
3
+ "lanes": [
4
+ {
5
+ "id": "concept",
6
+ "label": "Concept / Ideation",
7
+ "description": "Initial creature concepts, sketches, ideation explorations",
8
+ "id_patterns": ["^concept_", "^sketch_", "^ideation_"]
9
+ },
10
+ {
11
+ "id": "orthographic",
12
+ "label": "Orthographic / Model Sheet",
13
+ "description": "Turnaround views, model sheets, orthographic projections for modelers",
14
+ "id_patterns": ["^ortho_", "^model_sheet_", "^turnaround_"]
15
+ },
16
+ {
17
+ "id": "detail_study",
18
+ "label": "Detail Study",
19
+ "description": "Close-up texture studies, anatomical details, surface material explorations",
20
+ "id_patterns": ["^detail_", "^closeup_", "^texture_"]
21
+ },
22
+ {
23
+ "id": "action",
24
+ "label": "Action / Locomotion",
25
+ "description": "Action poses, attack stances, locomotion studies, movement keys",
26
+ "id_patterns": ["^action_", "^attack_", "^locomotion_"]
27
+ },
28
+ {
29
+ "id": "scale_reference",
30
+ "label": "Scale Reference",
31
+ "description": "Size comparison charts, scale references against humans or known objects",
32
+ "id_patterns": ["^scale_", "^size_", "^comparison_"]
33
+ },
34
+ {
35
+ "id": "habitat",
36
+ "label": "Habitat / Environment",
37
+ "description": "Creature in environment context, habitat integration, ecological scenes",
38
+ "id_patterns": ["^habitat_", "^environment_", "^context_"]
39
+ }
40
+ ]
41
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "TEMPLATE",
3
+ "display_name": "TEMPLATE",
4
+ "domain": "creature-design",
5
+ "version": "0.1.0",
6
+ "description": "Creature concept art — fantasy creatures, alien species, monsters, wildlife, and mythological beings.",
7
+ "defaults": {
8
+ "checkpoint": "",
9
+ "loras": [],
10
+ "width": 1024,
11
+ "height": 1024,
12
+ "steps": 8,
13
+ "cfg": 2.0,
14
+ "sampler": "dpmpp_sde",
15
+ "scheduler": "karras",
16
+ "comfy_url": "http://127.0.0.1:8188"
17
+ }
18
+ }
@@ -0,0 +1,39 @@
1
+ {
2
+ "dimensions": [
3
+ "anatomy_accuracy",
4
+ "silhouette_distinction",
5
+ "surface_texture",
6
+ "evolutionary_logic",
7
+ "scale_accuracy",
8
+ "locomotion_read",
9
+ "behavioral_read",
10
+ "style_consistency",
11
+ "habitat_fit"
12
+ ],
13
+ "thresholds": {
14
+ "approved": {
15
+ "pass": 0.7,
16
+ "partial": 0.5
17
+ },
18
+ "borderline": {
19
+ "pass": 0.7,
20
+ "partial": 0.5
21
+ },
22
+ "rejected": {
23
+ "fail_ceiling": 0.4,
24
+ "partial_ceiling": 0.6
25
+ }
26
+ },
27
+ "failure_to_rules": {
28
+ "broken_anatomy": ["ANA-001"],
29
+ "generic_monster": ["SIL-001"],
30
+ "wrong_texture": ["SUR-001"],
31
+ "impossible_biology": ["EVO-001"],
32
+ "no_scale_reference": ["SCL-001"],
33
+ "unclear_locomotion": ["LOC-001"],
34
+ "no_behavior": ["BEH-001"],
35
+ "style_mismatch": ["STY-001"],
36
+ "habitat_mismatch": ["HAB-001"],
37
+ "inconsistent_anatomy": ["ANA-002"]
38
+ }
39
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "group_label": "species",
3
+ "id_detection_order": [],
4
+ "prompt_detection_order": [],
5
+ "groups": {},
6
+ "cross_group_patterns": {},
7
+ "edge_defaults": {},
8
+ "null_faction_patterns": [],
9
+ "id_fallbacks": {},
10
+ "training_profiles": [
11
+ {
12
+ "profile_id": "creature-style",
13
+ "intended_use": "Creature design consistency LoRA",
14
+ "eligible_lanes": ["concept", "orthographic", "detail_study"],
15
+ "minimum_review_threshold": 0.7,
16
+ "excluded_content": ["rejected"],
17
+ "export_format": "trl"
18
+ }
19
+ ]
20
+ }
@@ -0,0 +1,113 @@
1
+ {
2
+ "version": "1.0.0",
3
+ "rules": [
4
+ {
5
+ "id": "STY-001",
6
+ "category": "style",
7
+ "desc": "Consistent art style across all assets — no style drift between assets",
8
+ "dims": ["style_consistency"],
9
+ "faction_specific": false,
10
+ "rationale_pass": "Art style consistent with project bible (${scorePct}%)",
11
+ "rationale_fail": "Style drifts from project bible — wrong rendering approach (${scorePct}%)"
12
+ },
13
+ {
14
+ "id": "CMP-001",
15
+ "category": "composition",
16
+ "desc": "Clear composition and framing appropriate to lane — subject fills frame, readable staging",
17
+ "dims": ["composition"],
18
+ "faction_specific": false,
19
+ "rationale_pass": "Composition clear — subject properly framed and staged (${scorePct}%)",
20
+ "rationale_fail": "Composition fails — subject poorly framed or cluttered (${scorePct}%)"
21
+ },
22
+ {
23
+ "id": "SIL-001",
24
+ "category": "silhouette",
25
+ "desc": "Silhouette readable at gameplay scale — identifiable at target resolution",
26
+ "dims": ["silhouette_clarity"],
27
+ "faction_specific": false,
28
+ "rationale_pass": "Silhouette readable at gameplay scale (${scorePct}%)",
29
+ "rationale_fail": "Silhouette unreadable at gameplay scale — details merge or vanish (${scorePct}%)"
30
+ },
31
+ {
32
+ "id": "COL-001",
33
+ "category": "color",
34
+ "desc": "Color harmony within project palette — correct hue relationships and saturation level",
35
+ "dims": ["palette_adherence"],
36
+ "faction_specific": false,
37
+ "rationale_pass": "Palette harmonious and within project range (${scorePct}%)",
38
+ "rationale_fail": "Palette dissonant or outside project range (${scorePct}%)"
39
+ },
40
+ {
41
+ "id": "MAT-001",
42
+ "category": "material",
43
+ "desc": "Material surfaces read correctly — metal reads as metal, cloth as cloth, no ambiguous surfaces",
44
+ "dims": ["material_fidelity"],
45
+ "faction_specific": true,
46
+ "rationale_pass": "Materials read correctly — surfaces match ${groupMaterial} (${scorePct}%)",
47
+ "rationale_fail": "Materials ambiguous — surfaces don't read as ${groupMaterial} (${scorePct}%)"
48
+ },
49
+ {
50
+ "id": "GRP-001",
51
+ "category": "identity",
52
+ "desc": "Style-group differentiation — assets from different groups look visually distinct",
53
+ "dims": ["style_group_read"],
54
+ "faction_specific": true,
55
+ "rationale_pass": "Style group reads clearly — distinct from other groups (${scorePct}%)",
56
+ "rationale_fail": "Style group unreadable — could belong to any group (${scorePct}%)"
57
+ },
58
+ {
59
+ "id": "WEA-001",
60
+ "category": "wear",
61
+ "desc": "Wear and aging appropriate to context — not too clean, not over-damaged",
62
+ "dims": ["wear_level"],
63
+ "faction_specific": true,
64
+ "rationale_pass": "Wear level appropriate — matches ${groupWear} (${scorePct}%)",
65
+ "rationale_fail": "Wear level wrong — doesn't match ${groupWear} (${scorePct}%)"
66
+ },
67
+ {
68
+ "id": "LGT-001",
69
+ "category": "lighting",
70
+ "desc": "Consistent lighting direction and mood across assets — no conflicting light sources",
71
+ "dims": ["composition", "style_consistency"],
72
+ "faction_specific": false,
73
+ "rationale_pass": "Lighting consistent — direction and mood match project standard (${scorePct}%)",
74
+ "rationale_fail": "Lighting inconsistent — wrong direction or mood (${scorePct}%)"
75
+ },
76
+ {
77
+ "id": "GEN-001",
78
+ "category": "originality",
79
+ "desc": "No generic or stock-art appearance — assets must feel authored, not asset-store pulls",
80
+ "dims": ["style_consistency", "style_group_read"],
81
+ "faction_specific": false,
82
+ "rationale_pass": "Asset feels authored and project-specific (${scorePct}%)",
83
+ "rationale_fail": "Asset reads as generic stock art — no project identity (${scorePct}%)"
84
+ },
85
+ {
86
+ "id": "SCL-001",
87
+ "category": "scale",
88
+ "desc": "Scale reference present or implied — objects read at correct relative size",
89
+ "dims": ["composition", "detail_quality"],
90
+ "faction_specific": false,
91
+ "rationale_pass": "Scale reads correctly — objects at proper relative size (${scorePct}%)",
92
+ "rationale_fail": "Scale ambiguous — objects don't read at correct size (${scorePct}%)"
93
+ },
94
+ {
95
+ "id": "SHP-001",
96
+ "category": "shape",
97
+ "desc": "Shape language matches style group — geometry and proportions follow group vocabulary",
98
+ "dims": ["silhouette_clarity", "style_group_read"],
99
+ "faction_specific": true,
100
+ "rationale_pass": "Shape language compliant — ${groupShapes} (${scorePct}%)",
101
+ "rationale_fail": "Shape language violates group vocabulary — wrong geometry (${scorePct}%)"
102
+ },
103
+ {
104
+ "id": "DTL-001",
105
+ "category": "detail",
106
+ "desc": "Detail density appropriate to asset importance and screen size — hero assets get more detail",
107
+ "dims": ["detail_quality"],
108
+ "faction_specific": false,
109
+ "rationale_pass": "Detail density appropriate for asset role (${scorePct}%)",
110
+ "rationale_fail": "Detail density wrong — over-detailed background or under-detailed hero (${scorePct}%)"
111
+ }
112
+ ]
113
+ }
@@ -0,0 +1,47 @@
1
+ {
2
+ "default_lane": "character",
3
+ "lanes": [
4
+ {
5
+ "id": "character",
6
+ "label": "Character",
7
+ "description": "Character designs, costumes, faction-specific clothing and personal gear",
8
+ "id_patterns": ["^char_", "^chr_", "^npc_", "^pc_", "^hero_", "^villain_"]
9
+ },
10
+ {
11
+ "id": "environment",
12
+ "label": "Environment",
13
+ "description": "Landscapes, dungeons, towns, overworld locations, architectural exteriors",
14
+ "id_patterns": ["^env_", "^bg_", "^scene_", "^area_", "^map_", "^town_", "^dungeon_"]
15
+ },
16
+ {
17
+ "id": "prop",
18
+ "label": "Prop",
19
+ "description": "Interactive objects, quest items, consumables, treasure, story-carrying objects",
20
+ "id_patterns": ["^prop_", "^item_", "^obj_", "^loot_", "^quest_"]
21
+ },
22
+ {
23
+ "id": "ui",
24
+ "label": "UI Element",
25
+ "description": "Menu frames, icons, portraits, HUD elements, dialog boxes",
26
+ "id_patterns": ["^ui_", "^icon_", "^hud_", "^portrait_", "^menu_", "^frame_"]
27
+ },
28
+ {
29
+ "id": "ship",
30
+ "label": "Ship / Vehicle",
31
+ "description": "Ships, vehicles, mounts, mechanical transports — exterior views",
32
+ "id_patterns": ["^ship_", "^veh_", "^mount_", "^mech_", "^vehicle_"]
33
+ },
34
+ {
35
+ "id": "interior",
36
+ "label": "Interior",
37
+ "description": "Indoor spaces, ship interiors, room layouts, environmental storytelling",
38
+ "id_patterns": ["^int_", "^interior_", "^room_", "^cabin_", "^cockpit_"]
39
+ },
40
+ {
41
+ "id": "equipment",
42
+ "label": "Equipment",
43
+ "description": "Weapons, armor, tools, wearable gear with faction or class identity",
44
+ "id_patterns": ["^eqp_", "^wpn_", "^weapon_", "^armor_", "^tool_", "^gear_", "^equip_"]
45
+ }
46
+ ]
47
+ }