Add materialized catalog import bridge
This commit is contained in:
parent
3f5f6ff7ab
commit
23e81d1a96
10 changed files with 40829 additions and 0 deletions
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"generated_at": "2026-05-01T17:38:14.541Z",
|
||||
"slice": "catalog-materialization",
|
||||
"slice_status": "closed",
|
||||
"counts": {
|
||||
"content_packs": 14,
|
||||
"track_manifests": 14,
|
||||
"deck_import_specs": 498,
|
||||
"runtime_content_bundles": 498,
|
||||
"reference_targets": 9,
|
||||
"overlap_pruned_exclusions": 29
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,979 @@
|
|||
{
|
||||
"generated_at": "2026-05-01T17:38:14.541Z",
|
||||
"content_packs": [
|
||||
{
|
||||
"ContentPackId": "hypertwist/2x2-last-layer-systems/classiccube",
|
||||
"Title": "2x2 Last-Layer Systems",
|
||||
"Version": "2026.05.rewrite.01",
|
||||
"PuzzleFamily": "ClassicCube",
|
||||
"NotationProfile": "classic-wca",
|
||||
"TrackManifests": [
|
||||
{
|
||||
"TrackId": "2x2-last-layer-systems",
|
||||
"Title": "2x2 Last-Layer Systems",
|
||||
"Goal": "Stabilize compact last-layer recognition and execution for 2x2-focused finishing systems.",
|
||||
"DeckImportSpecIds": [
|
||||
"import/alg-trainer-algorithm-case-deck-full-eg"
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "2x2-last-layer-systems",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party authored track manifest for 2x2 Last-Layer Systems based on retained and rewritten course surfaces."
|
||||
}
|
||||
}
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party materialized content pack authored from the rewritten HyperTwist course layer for 2x2 Last-Layer Systems."
|
||||
}
|
||||
},
|
||||
{
|
||||
"ContentPackId": "hypertwist/advanced-3x3-systems/classiccube",
|
||||
"Title": "Advanced 3x3 Systems",
|
||||
"Version": "2026.05.rewrite.01",
|
||||
"PuzzleFamily": "ClassicCube",
|
||||
"NotationProfile": "classic-wca",
|
||||
"TrackManifests": [
|
||||
{
|
||||
"TrackId": "advanced-3x3-systems",
|
||||
"Title": "Advanced 3x3 Systems",
|
||||
"Goal": "Consolidate dense 3x3 algorithm families into repeatable high-accuracy timed practice.",
|
||||
"DeckImportSpecIds": [
|
||||
"import/alg-trainer-algorithm-case-deck-briggs-taylor-reduction-coll",
|
||||
"import/alg-trainer-algorithm-case-deck-cls-justin-taylor",
|
||||
"import/alg-trainer-algorithm-case-deck-cpeoll",
|
||||
"import/alg-trainer-algorithm-case-deck-ell-justin-taylor-tao-yu",
|
||||
"import/alg-trainer-algorithm-case-deck-pure-oll-minus-dots",
|
||||
"import/alg-trainer-algorithm-case-deck-tsle",
|
||||
"import/alg-trainer-algorithm-case-deck-ttll-justin-taylor",
|
||||
"import/alg-trainer-algorithm-case-deck-vhls-chad-batten",
|
||||
"import/alg-trainer-algorithm-case-deck-vls",
|
||||
"import/alg-trainer-algorithm-case-deck-vls-jayden-mcneill",
|
||||
"import/alg-trainer-algorithm-case-deck-zblse-john-mcwilliams",
|
||||
"import/alg-trainer-algorithm-case-deck-zz-ols-egide-hirwa",
|
||||
"import/alg-trainer-algorithm-case-deck-zzll",
|
||||
"import/cubedex-algorithm-case-deck-coll-antisune",
|
||||
"import/cubedex-algorithm-case-deck-coll-h",
|
||||
"import/cubedex-algorithm-case-deck-coll-l",
|
||||
"import/cubedex-algorithm-case-deck-coll-pi",
|
||||
"import/cubedex-algorithm-case-deck-coll-sune",
|
||||
"import/cubedex-algorithm-case-deck-coll-t",
|
||||
"import/cubedex-algorithm-case-deck-coll-u",
|
||||
"import/cubedex-algorithm-case-deck-f2l-both-in-slot",
|
||||
"import/cubedex-algorithm-case-deck-f2l-connected-pairs",
|
||||
"import/cubedex-algorithm-case-deck-f2l-corner-in-slot",
|
||||
"import/cubedex-algorithm-case-deck-f2l-edge-in-slot",
|
||||
"import/cubedex-algorithm-case-deck-f2l-free-pairs",
|
||||
"import/cubedex-algorithm-case-deck-f2l-split-pairs",
|
||||
"import/cubedex-algorithm-case-deck-oll-awkward",
|
||||
"import/cubedex-algorithm-case-deck-oll-c-shape",
|
||||
"import/cubedex-algorithm-case-deck-oll-dot",
|
||||
"import/cubedex-algorithm-case-deck-oll-fish",
|
||||
"import/cubedex-algorithm-case-deck-oll-knight-move",
|
||||
"import/cubedex-algorithm-case-deck-oll-l-shape",
|
||||
"import/cubedex-algorithm-case-deck-oll-lightning-bolts",
|
||||
"import/cubedex-algorithm-case-deck-oll-line",
|
||||
"import/cubedex-algorithm-case-deck-oll-oriented-corners",
|
||||
"import/cubedex-algorithm-case-deck-oll-oriented-edges",
|
||||
"import/cubedex-algorithm-case-deck-oll-p-shape",
|
||||
"import/cubedex-algorithm-case-deck-oll-square",
|
||||
"import/cubedex-algorithm-case-deck-oll-t-shape",
|
||||
"import/cubedex-algorithm-case-deck-oll-w-shape",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-1",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-2",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-3",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-4",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-5",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-6",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-7",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-8",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-9",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-10",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-11",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-12",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-13",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-14",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-15",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-16",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-17",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-18",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-19",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-20",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-21",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-22",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-23",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-24",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-25",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-26",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-27",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-28",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-29",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-30",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-31",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-32",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-33",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-34",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-35",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-36",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-37",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-38",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-39",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-40",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-41",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-42",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-43",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-44",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-45",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-46",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-47",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-48",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-49",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-50",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-51",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-52",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-53",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-54",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-55",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-56",
|
||||
"import/cubedex-algorithm-case-deck-ollcp-oll-57",
|
||||
"import/cubedex-algorithm-case-deck-pll-adjacent-corners",
|
||||
"import/cubedex-algorithm-case-deck-pll-diagonal-corners",
|
||||
"import/cubedex-algorithm-case-deck-pll-edge-perm",
|
||||
"import/cubedex-algorithm-case-deck-vhls-connected-pairs",
|
||||
"import/cubedex-algorithm-case-deck-vhls-split-pairs",
|
||||
"import/cubedex-algorithm-case-deck-wvls-0-oriented",
|
||||
"import/cubedex-algorithm-case-deck-wvls-1-oriented",
|
||||
"import/cubedex-algorithm-case-deck-wvls-2-oriented",
|
||||
"import/cubedex-algorithm-case-deck-wvls-3-oriented",
|
||||
"import/cubedex-algorithm-case-deck-zbll-as1",
|
||||
"import/cubedex-algorithm-case-deck-zbll-as2",
|
||||
"import/cubedex-algorithm-case-deck-zbll-as3",
|
||||
"import/cubedex-algorithm-case-deck-zbll-as4",
|
||||
"import/cubedex-algorithm-case-deck-zbll-as5",
|
||||
"import/cubedex-algorithm-case-deck-zbll-as6",
|
||||
"import/cubedex-algorithm-case-deck-zbll-h1",
|
||||
"import/cubedex-algorithm-case-deck-zbll-h2",
|
||||
"import/cubedex-algorithm-case-deck-zbll-h3",
|
||||
"import/cubedex-algorithm-case-deck-zbll-h4",
|
||||
"import/cubedex-algorithm-case-deck-zbll-l1",
|
||||
"import/cubedex-algorithm-case-deck-zbll-l2",
|
||||
"import/cubedex-algorithm-case-deck-zbll-l3",
|
||||
"import/cubedex-algorithm-case-deck-zbll-l4",
|
||||
"import/cubedex-algorithm-case-deck-zbll-l5",
|
||||
"import/cubedex-algorithm-case-deck-zbll-l6",
|
||||
"import/cubedex-algorithm-case-deck-zbll-pi1",
|
||||
"import/cubedex-algorithm-case-deck-zbll-pi2",
|
||||
"import/cubedex-algorithm-case-deck-zbll-pi3",
|
||||
"import/cubedex-algorithm-case-deck-zbll-pi4",
|
||||
"import/cubedex-algorithm-case-deck-zbll-pi5",
|
||||
"import/cubedex-algorithm-case-deck-zbll-pi6",
|
||||
"import/cubedex-algorithm-case-deck-zbll-s1",
|
||||
"import/cubedex-algorithm-case-deck-zbll-s2",
|
||||
"import/cubedex-algorithm-case-deck-zbll-s3",
|
||||
"import/cubedex-algorithm-case-deck-zbll-s4",
|
||||
"import/cubedex-algorithm-case-deck-zbll-s5",
|
||||
"import/cubedex-algorithm-case-deck-zbll-s6",
|
||||
"import/cubedex-algorithm-case-deck-zbll-t1",
|
||||
"import/cubedex-algorithm-case-deck-zbll-t2",
|
||||
"import/cubedex-algorithm-case-deck-zbll-t3",
|
||||
"import/cubedex-algorithm-case-deck-zbll-t4",
|
||||
"import/cubedex-algorithm-case-deck-zbll-t5",
|
||||
"import/cubedex-algorithm-case-deck-zbll-t6",
|
||||
"import/cubedex-algorithm-case-deck-zbll-u1",
|
||||
"import/cubedex-algorithm-case-deck-zbll-u2",
|
||||
"import/cubedex-algorithm-case-deck-zbll-u3",
|
||||
"import/cubedex-algorithm-case-deck-zbll-u4",
|
||||
"import/cubedex-algorithm-case-deck-zbll-u5",
|
||||
"import/cubedex-algorithm-case-deck-zbll-u6",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-1",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-2",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-3",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-4",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-5",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-6",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-7",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-8",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-9",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-10",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-11",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-12",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-13",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-14",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-15",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-16",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-17",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-18",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-19",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-20",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-21",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-22",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-23",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-24",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-25",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-26",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-27",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-28",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-29",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-30",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-31",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-32",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-33",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-34",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-35",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-36",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-37",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-38",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-39",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-40",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-41",
|
||||
"import/cubedex-algorithm-case-deck-zbls-case-42",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll01-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll02-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll03-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll04-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll05-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll06-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll07-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll08-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll09-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll10-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll11-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll12-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll13-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll14-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll15-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll16-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll17-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll18-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll19-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll28-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll29-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll30-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll31-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll32-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll33-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll34-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll35-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll36-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll37-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll38-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll39-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll40-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll41-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll42-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll43-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll44-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll45-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll46-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll47-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll48-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll49-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll50-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll51-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll52-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll53-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll54-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll55-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll56-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-1lll57-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-advancedf2l-both-pieces-trapped",
|
||||
"import/speedcubedb-algorithm-case-deck-advancedf2l-trapped-corner",
|
||||
"import/speedcubedb-algorithm-case-deck-advancedf2l-trapped-edge",
|
||||
"import/speedcubedb-algorithm-case-deck-antipll-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-ell-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-eo4a-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-fruf-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-sbls-corner-on-d-facing-forward",
|
||||
"import/speedcubedb-algorithm-case-deck-sbls-corner-on-d-facing-side",
|
||||
"import/speedcubedb-algorithm-case-deck-sbls-corner-on-d-solved",
|
||||
"import/speedcubedb-algorithm-case-deck-sbls-corner-on-u-facing-up",
|
||||
"import/speedcubedb-algorithm-case-deck-sbls-corner-on-u-misoriented",
|
||||
"import/speedcubedb-algorithm-case-deck-sbls-corner-on-u-oriented",
|
||||
"import/speedcubedb-algorithm-case-deck-sv-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-vlsne-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-vlsub-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-vlsubul-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-vlsuf-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-vlsufub-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-vlsuful-3x3",
|
||||
"import/speedcubedb-algorithm-case-deck-vlsul-3x3"
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "advanced-3x3-systems",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party authored track manifest for Advanced 3x3 Systems based on retained and rewritten course surfaces."
|
||||
}
|
||||
}
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party materialized content pack authored from the rewritten HyperTwist course layer for Advanced 3x3 Systems."
|
||||
}
|
||||
},
|
||||
{
|
||||
"ContentPackId": "hypertwist/big-cube-systems/classiccube",
|
||||
"Title": "Big Cube Systems",
|
||||
"Version": "2026.05.rewrite.01",
|
||||
"PuzzleFamily": "ClassicCube",
|
||||
"NotationProfile": "classic-wca",
|
||||
"TrackManifests": [
|
||||
{
|
||||
"TrackId": "big-cube-systems",
|
||||
"Title": "Big Cube Systems",
|
||||
"Goal": "Practice parity and late-stage big-cube systems as explicit advanced finish drills.",
|
||||
"DeckImportSpecIds": [
|
||||
"import/speedcubedb-algorithm-case-deck-l2c-5x5",
|
||||
"import/speedcubedb-algorithm-case-deck-l2e-5x5",
|
||||
"import/speedcubedb-algorithm-case-deck-ollparity-4x4",
|
||||
"import/speedcubedb-algorithm-case-deck-pllparity-adj-corner-swap",
|
||||
"import/speedcubedb-algorithm-case-deck-pllparity-diag-corner-swap",
|
||||
"import/speedcubedb-algorithm-case-deck-pllparity-edge-swap"
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "big-cube-systems",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party authored track manifest for Big Cube Systems based on retained and rewritten course surfaces."
|
||||
}
|
||||
}
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party materialized content pack authored from the rewritten HyperTwist course layer for Big Cube Systems."
|
||||
}
|
||||
},
|
||||
{
|
||||
"ContentPackId": "hypertwist/blindfold-edge-cycle-systems/classiccube",
|
||||
"Title": "Blindfold Edge Cycle Systems",
|
||||
"Version": "2026.05.rewrite.01",
|
||||
"PuzzleFamily": "ClassicCube",
|
||||
"NotationProfile": "classic-wca",
|
||||
"TrackManifests": [
|
||||
{
|
||||
"TrackId": "blindfold-edge-cycle-systems",
|
||||
"Title": "Blindfold Edge Cycle Systems",
|
||||
"Goal": "Build consistent edge-cycle execution and recall under blindfold-oriented training flows.",
|
||||
"DeckImportSpecIds": [
|
||||
"import/5style-trainer-algorithm-case-deck-5-style"
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "blindfold-edge-cycle-systems",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party authored track manifest for Blindfold Edge Cycle Systems based on retained and rewritten course surfaces."
|
||||
}
|
||||
}
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party materialized content pack authored from the rewritten HyperTwist course layer for Blindfold Edge Cycle Systems."
|
||||
}
|
||||
},
|
||||
{
|
||||
"ContentPackId": "hypertwist/blindfold-memo-and-commutators/classiccube",
|
||||
"Title": "Blindfold Memo and Commutators",
|
||||
"Version": "2026.05.rewrite.01",
|
||||
"PuzzleFamily": "ClassicCube",
|
||||
"NotationProfile": "classic-wca",
|
||||
"TrackManifests": [
|
||||
{
|
||||
"TrackId": "blindfold-memo-and-commutators",
|
||||
"Title": "Blindfold Memo and Commutators",
|
||||
"Goal": "Develop memo fluency, commutator recall, and parity/twist recovery under blindfold practice constraints.",
|
||||
"DeckImportSpecIds": [
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-db-edge",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-df-edge",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-df-old-edge",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-dfr-corner",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-dl-edge",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-dlf-corner",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-dr-edge",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-fl-edge",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-fr-edge",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-fur-wing",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-ub-edge",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-ub-graham-siggins-edge",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-ubr-corner",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-uf-edge",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-uf-graham-siggins-edge",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-uf-t-center",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-ufl-corner",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-ul-edge",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-ulb-corner",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-ulb-old-corner",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-ur-edge",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-urf-corner",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-urf-daniel-lin-corner",
|
||||
"import/cube-trainer-algorithm-case-deck-commutator-urf-x-center",
|
||||
"import/cube-trainer-algorithm-case-deck-corner-twists-unnamed-algs",
|
||||
"import/cube-trainer-algorithm-case-deck-edge-flips-unnamed-algs"
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "blindfold-memo-and-commutators",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party authored track manifest for Blindfold Memo and Commutators based on retained and rewritten course surfaces."
|
||||
}
|
||||
}
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party materialized content pack authored from the rewritten HyperTwist course layer for Blindfold Memo and Commutators."
|
||||
}
|
||||
},
|
||||
{
|
||||
"ContentPackId": "hypertwist/cross-planning/classiccube",
|
||||
"Title": "Cross Planning",
|
||||
"Version": "2026.05.rewrite.01",
|
||||
"PuzzleFamily": "ClassicCube",
|
||||
"NotationProfile": "classic-wca",
|
||||
"TrackManifests": [
|
||||
{
|
||||
"TrackId": "cross-planning",
|
||||
"Title": "Cross Planning",
|
||||
"Goal": "Train cross planning from constrained scramble ladders and preserve deliberate inspection-first execution.",
|
||||
"DeckImportSpecIds": [
|
||||
"import/rubiks-cross-trainer-scramble-drill-deck-cross-1-move",
|
||||
"import/rubiks-cross-trainer-scramble-drill-deck-cross-2-moves",
|
||||
"import/rubiks-cross-trainer-scramble-drill-deck-cross-3-moves",
|
||||
"import/rubiks-cross-trainer-scramble-drill-deck-cross-4-moves",
|
||||
"import/rubiks-cross-trainer-scramble-drill-deck-cross-5-moves",
|
||||
"import/rubiks-cross-trainer-scramble-drill-deck-cross-6-moves",
|
||||
"import/rubiks-cross-trainer-scramble-drill-deck-cross-7-moves",
|
||||
"import/rubiks-cross-trainer-scramble-drill-deck-cross-8-moves"
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "cross-planning",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party authored track manifest for Cross Planning based on retained and rewritten course surfaces."
|
||||
}
|
||||
}
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party materialized content pack authored from the rewritten HyperTwist course layer for Cross Planning."
|
||||
}
|
||||
},
|
||||
{
|
||||
"ContentPackId": "hypertwist/foundational-last-layer-systems/classiccube",
|
||||
"Title": "Foundational Last-Layer Systems",
|
||||
"Version": "2026.05.rewrite.01",
|
||||
"PuzzleFamily": "ClassicCube",
|
||||
"NotationProfile": "classic-wca",
|
||||
"TrackManifests": [
|
||||
{
|
||||
"TrackId": "foundational-last-layer-systems",
|
||||
"Title": "Foundational Last-Layer Systems",
|
||||
"Goal": "Move from broad recognition toward stable foundational last-layer execution patterns.",
|
||||
"DeckImportSpecIds": [
|
||||
"import/cubedex-algorithm-case-deck-2-look-oll-corners",
|
||||
"import/cubedex-algorithm-case-deck-2-look-oll-edges",
|
||||
"import/cubedex-algorithm-case-deck-2-look-pll-corners",
|
||||
"import/cubedex-algorithm-case-deck-2-look-pll-edges"
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "foundational-last-layer-systems",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party authored track manifest for Foundational Last-Layer Systems based on retained and rewritten course surfaces."
|
||||
}
|
||||
}
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party materialized content pack authored from the rewritten HyperTwist course layer for Foundational Last-Layer Systems."
|
||||
}
|
||||
},
|
||||
{
|
||||
"ContentPackId": "hypertwist/megaminx-systems/other",
|
||||
"Title": "Megaminx Systems · Other",
|
||||
"Version": "2026.05.rewrite.01",
|
||||
"PuzzleFamily": "Other",
|
||||
"NotationProfile": "megaminx-standard",
|
||||
"TrackManifests": [
|
||||
{
|
||||
"TrackId": "megaminx-systems",
|
||||
"Title": "Megaminx Systems",
|
||||
"Goal": "Practice Megaminx finishing systems as structured case families with first-party wording.",
|
||||
"DeckImportSpecIds": [
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxco-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxcp-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxeo-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxep-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll1-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll2-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll3-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll4-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll5-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll6-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll7-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll8-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll9-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll10-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll11-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll12-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll13-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll14-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll15-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll16-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll17-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll18-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll19-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll20-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll21-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll22-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll23-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll24-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll25-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll26-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll27-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll28-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll29-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll30-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll31-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll32-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll33-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll34-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll35-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll36-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxoll37-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxplla-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxpllb-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxpllc-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxplld-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxplle-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxpllf-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxpllg-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxpllh-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxplli-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxpllj-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxpllk-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxplll-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxpllm-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxplln-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxpllp-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxpllq-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxpllr-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxplls-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxpllt-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxpllu-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxpllv-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxpllw-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxpllx-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxplly-megaminx",
|
||||
"import/speedcubedb-algorithm-case-deck-megaminxpllz-megaminx"
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "megaminx-systems",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party authored track manifest for Megaminx Systems based on retained and rewritten course surfaces."
|
||||
}
|
||||
}
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party materialized content pack authored from the rewritten HyperTwist course layer for Megaminx Systems."
|
||||
}
|
||||
},
|
||||
{
|
||||
"ContentPackId": "hypertwist/one-handed-systems/classiccube",
|
||||
"Title": "One-Handed Systems",
|
||||
"Version": "2026.05.rewrite.01",
|
||||
"PuzzleFamily": "ClassicCube",
|
||||
"NotationProfile": "classic-wca",
|
||||
"TrackManifests": [
|
||||
{
|
||||
"TrackId": "one-handed-systems",
|
||||
"Title": "One-Handed Systems",
|
||||
"Goal": "Shape one-handed recognition and execution practice around fingertrick-aware case families.",
|
||||
"DeckImportSpecIds": [
|
||||
"import/alg-trainer-algorithm-case-deck-oh-cmll",
|
||||
"import/alg-trainer-algorithm-case-deck-oh-oll",
|
||||
"import/alg-trainer-algorithm-case-deck-oh-pll",
|
||||
"import/cubingapp-algorithm-case-deck-oh-cmll-antisune",
|
||||
"import/cubingapp-algorithm-case-deck-oh-cmll-h",
|
||||
"import/cubingapp-algorithm-case-deck-oh-cmll-l",
|
||||
"import/cubingapp-algorithm-case-deck-oh-cmll-o",
|
||||
"import/cubingapp-algorithm-case-deck-oh-cmll-pi",
|
||||
"import/cubingapp-algorithm-case-deck-oh-cmll-sune",
|
||||
"import/cubingapp-algorithm-case-deck-oh-cmll-t",
|
||||
"import/cubingapp-algorithm-case-deck-oh-cmll-u"
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "one-handed-systems",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party authored track manifest for One-Handed Systems based on retained and rewritten course surfaces."
|
||||
}
|
||||
}
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party materialized content pack authored from the rewritten HyperTwist course layer for One-Handed Systems."
|
||||
}
|
||||
},
|
||||
{
|
||||
"ContentPackId": "hypertwist/pyraminx-systems/other",
|
||||
"Title": "Pyraminx Systems · Other",
|
||||
"Version": "2026.05.rewrite.01",
|
||||
"PuzzleFamily": "Other",
|
||||
"NotationProfile": "pyraminx-standard",
|
||||
"TrackManifests": [
|
||||
{
|
||||
"TrackId": "pyraminx-systems",
|
||||
"Title": "Pyraminx Systems",
|
||||
"Goal": "Practice Pyraminx last-layer and edge systems as concise first-party drill surfaces.",
|
||||
"DeckImportSpecIds": [
|
||||
"import/cubingapp-algorithm-case-deck-pyraminx-last-layer",
|
||||
"import/speedcubedb-algorithm-case-deck-l3e-pyraminx",
|
||||
"import/speedcubedb-algorithm-case-deck-l4e-connected-bar",
|
||||
"import/speedcubedb-algorithm-case-deck-l4e-flipped-edges",
|
||||
"import/speedcubedb-algorithm-case-deck-l4e-l3e",
|
||||
"import/speedcubedb-algorithm-case-deck-l4e-last-layer",
|
||||
"import/speedcubedb-algorithm-case-deck-l4e-no-bar",
|
||||
"import/speedcubedb-algorithm-case-deck-l4e-polish-flip",
|
||||
"import/speedcubedb-algorithm-case-deck-l4e-separated-bar"
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "pyraminx-systems",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party authored track manifest for Pyraminx Systems based on retained and rewritten course surfaces."
|
||||
}
|
||||
}
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party materialized content pack authored from the rewritten HyperTwist course layer for Pyraminx Systems."
|
||||
}
|
||||
},
|
||||
{
|
||||
"ContentPackId": "hypertwist/roux-and-blockbuilding-systems/classiccube",
|
||||
"Title": "Roux and Blockbuilding Systems",
|
||||
"Version": "2026.05.rewrite.01",
|
||||
"PuzzleFamily": "ClassicCube",
|
||||
"NotationProfile": "classic-wca",
|
||||
"TrackManifests": [
|
||||
{
|
||||
"TrackId": "roux-and-blockbuilding-systems",
|
||||
"Title": "Roux and Blockbuilding Systems",
|
||||
"Goal": "Train Roux-adjacent blocks, last-six-edge systems, and generated random-state modes through first-party scaffolding.",
|
||||
"DeckImportSpecIds": [
|
||||
"import/alg-trainer-algorithm-case-deck-2-look-l5e-fr-eo",
|
||||
"import/alg-trainer-algorithm-case-deck-cp-solved-1lll-jack-love",
|
||||
"import/alg-trainer-algorithm-case-deck-cp-solved-ollcp",
|
||||
"import/alg-trainer-algorithm-case-deck-cpls-arc",
|
||||
"import/alg-trainer-algorithm-case-deck-els-br-justin-taylor",
|
||||
"import/alg-trainer-algorithm-case-deck-els-fr-justin-taylor",
|
||||
"import/alg-trainer-algorithm-case-deck-l5e-justin-taylor",
|
||||
"import/alg-trainer-algorithm-case-deck-l5ep-justin-micki",
|
||||
"import/alg-trainer-algorithm-case-deck-tols-justin-taylor",
|
||||
"import/cubedex-algorithm-case-deck-cmll-antisune",
|
||||
"import/cubedex-algorithm-case-deck-cmll-h",
|
||||
"import/cubedex-algorithm-case-deck-cmll-l",
|
||||
"import/cubedex-algorithm-case-deck-cmll-o",
|
||||
"import/cubedex-algorithm-case-deck-cmll-pi",
|
||||
"import/cubedex-algorithm-case-deck-cmll-sune",
|
||||
"import/cubedex-algorithm-case-deck-cmll-t",
|
||||
"import/cubedex-algorithm-case-deck-cmll-u",
|
||||
"import/cubedex-algorithm-case-deck-l6e-eo-3-mover",
|
||||
"import/cubedex-algorithm-case-deck-l6e-eo-5-mover",
|
||||
"import/cubedex-algorithm-case-deck-l6e-eo-7-mover",
|
||||
"import/cubedex-algorithm-case-deck-l6e-eo-11-mover",
|
||||
"import/cubedex-algorithm-case-deck-l6e-eolr-0-2",
|
||||
"import/cubedex-algorithm-case-deck-l6e-eolr-1-1",
|
||||
"import/cubedex-algorithm-case-deck-l6e-eolr-2-adj-0",
|
||||
"import/cubedex-algorithm-case-deck-l6e-eolr-2-adj-2",
|
||||
"import/cubedex-algorithm-case-deck-l6e-eolr-2-opp-0",
|
||||
"import/cubedex-algorithm-case-deck-l6e-eolr-2-opp-2",
|
||||
"import/cubedex-algorithm-case-deck-l6e-eolr-all-6",
|
||||
"import/cubedex-algorithm-case-deck-l6e-eolr-arrow",
|
||||
"import/roux-trainers-algorithm-case-deck-cmll-custom",
|
||||
"import/roux-trainers-algorithm-case-deck-cmll-default",
|
||||
"import/roux-trainers-algorithm-case-deck-nmcll",
|
||||
"import/roux-trainers-algorithm-case-deck-ollcp",
|
||||
"import/roux-trainers-algorithm-case-deck-trigger",
|
||||
"import/roux-trainers-algorithm-case-deck-u-auf",
|
||||
"import/roux-trainers-generative-trainer-surface-roux-generative-4c-lse-4c-trainer",
|
||||
"import/roux-trainers-generative-trainer-surface-roux-generative-ancillary-runtime-modes-analyzer-tracking-experimental",
|
||||
"import/roux-trainers-generative-trainer-surface-roux-generative-cmll-cmll-randomized-trainer",
|
||||
"import/roux-trainers-generative-trainer-surface-roux-generative-eopair-eolr-trainer",
|
||||
"import/roux-trainers-generative-trainer-surface-roux-generative-fb-fb-analyzer-trainer",
|
||||
"import/roux-trainers-generative-trainer-surface-roux-generative-fbdr-fbdr-trainer",
|
||||
"import/roux-trainers-generative-trainer-surface-roux-generative-fbss-fbss-trainer",
|
||||
"import/roux-trainers-generative-trainer-surface-roux-generative-fs-fs-trainer",
|
||||
"import/roux-trainers-generative-trainer-surface-roux-generative-fsdr-fsdr-trainer",
|
||||
"import/roux-trainers-generative-trainer-surface-roux-generative-ss-ss-trainer",
|
||||
"import/roux-trainers-selector-catalog-orientation-uf-color-scheme"
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "roux-and-blockbuilding-systems",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party authored track manifest for Roux and Blockbuilding Systems based on retained and rewritten course surfaces."
|
||||
}
|
||||
}
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party materialized content pack authored from the rewritten HyperTwist course layer for Roux and Blockbuilding Systems."
|
||||
}
|
||||
},
|
||||
{
|
||||
"ContentPackId": "hypertwist/skewb-systems/other",
|
||||
"Title": "Skewb Systems · Other",
|
||||
"Version": "2026.05.rewrite.01",
|
||||
"PuzzleFamily": "Other",
|
||||
"NotationProfile": "skewb-standard",
|
||||
"TrackManifests": [
|
||||
{
|
||||
"TrackId": "skewb-systems",
|
||||
"Title": "Skewb Systems",
|
||||
"Goal": "Practice Sarah and advanced Skewb finishing systems through normalized first-party drills.",
|
||||
"DeckImportSpecIds": [
|
||||
"import/cubingapp-algorithm-case-deck-sarah-intermediate-1-trigger",
|
||||
"import/cubingapp-algorithm-case-deck-sarah-intermediate-2-triggers",
|
||||
"import/cubingapp-algorithm-case-deck-sarah-intermediate-3-triggers",
|
||||
"import/speedcubedb-algorithm-case-deck-sarahsadvanced-l4c",
|
||||
"import/speedcubedb-algorithm-case-deck-sarahsadvanced-l5c",
|
||||
"import/speedcubedb-algorithm-case-deck-sarahsadvanced-peanut-h-or-z-perm-and-pure-peanut",
|
||||
"import/speedcubedb-algorithm-case-deck-sarahsadvanced-peanut-horizontal-u-perm",
|
||||
"import/speedcubedb-algorithm-case-deck-sarahsadvanced-peanut-o-perm",
|
||||
"import/speedcubedb-algorithm-case-deck-sarahsadvanced-peanut-swirl-perm",
|
||||
"import/speedcubedb-algorithm-case-deck-sarahsadvanced-peanut-triple-sledge",
|
||||
"import/speedcubedb-algorithm-case-deck-sarahsadvanced-peanut-vertical-u-perm",
|
||||
"import/speedcubedb-algorithm-case-deck-sarahsadvanced-peanut-wat-perm",
|
||||
"import/speedcubedb-algorithm-case-deck-sarahsadvanced-peanut-x-perm",
|
||||
"import/speedcubedb-algorithm-case-deck-sarahsadvanced-peanut-z-perm-conjugates",
|
||||
"import/speedcubedb-algorithm-case-deck-sarahsadvanced-pi-h-or-z-perm",
|
||||
"import/speedcubedb-algorithm-case-deck-sarahsadvanced-pi-horizontal-u-perm",
|
||||
"import/speedcubedb-algorithm-case-deck-sarahsadvanced-pi-o-perm",
|
||||
"import/speedcubedb-algorithm-case-deck-sarahsadvanced-pi-swirl-perm",
|
||||
"import/speedcubedb-algorithm-case-deck-sarahsadvanced-pi-triple-sledge",
|
||||
"import/speedcubedb-algorithm-case-deck-sarahsadvanced-pi-vertical-u-perm",
|
||||
"import/speedcubedb-algorithm-case-deck-sarahsadvanced-pi-wat-perm",
|
||||
"import/speedcubedb-algorithm-case-deck-sarahsadvanced-pi-x-perm",
|
||||
"import/speedcubedb-algorithm-case-deck-sarahsadvanced-pi-z-perm-conjugates"
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "skewb-systems",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party authored track manifest for Skewb Systems based on retained and rewritten course surfaces."
|
||||
}
|
||||
}
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party materialized content pack authored from the rewritten HyperTwist course layer for Skewb Systems."
|
||||
}
|
||||
},
|
||||
{
|
||||
"ContentPackId": "hypertwist/specialized-3x3-systems/classiccube",
|
||||
"Title": "Specialized 3x3 Systems",
|
||||
"Version": "2026.05.rewrite.01",
|
||||
"PuzzleFamily": "ClassicCube",
|
||||
"NotationProfile": "classic-wca",
|
||||
"TrackManifests": [
|
||||
{
|
||||
"TrackId": "specialized-3x3-systems",
|
||||
"Title": "Specialized 3x3 Systems",
|
||||
"Goal": "Retain niche 3x3 case families as explicit advanced specialization tracks rather than generic mainstream overlap.",
|
||||
"DeckImportSpecIds": [
|
||||
"import/alg-trainer-algorithm-case-deck-1lll-micki-kanaiya-harning-wip",
|
||||
"import/alg-trainer-algorithm-case-deck-2gll",
|
||||
"import/alg-trainer-algorithm-case-deck-42-shadowslice",
|
||||
"import/alg-trainer-algorithm-case-deck-cr-matt-dipalma",
|
||||
"import/alg-trainer-algorithm-case-deck-domino-reduction",
|
||||
"import/alg-trainer-algorithm-case-deck-floating-two-edge-flips-ishaan-agrawal",
|
||||
"import/alg-trainer-algorithm-case-deck-ol5c-sqaree",
|
||||
"import/alg-trainer-algorithm-case-deck-one-look-wednesdays-daniel-rose-levine",
|
||||
"import/alg-trainer-algorithm-case-deck-ribbon-multislotting",
|
||||
"import/alg-trainer-algorithm-case-deck-tdr-trangium-yash-mehta",
|
||||
"import/alg-trainer-algorithm-case-deck-tripod-akanearcane"
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "specialized-3x3-systems",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party authored track manifest for Specialized 3x3 Systems based on retained and rewritten course surfaces."
|
||||
}
|
||||
}
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party materialized content pack authored from the rewritten HyperTwist course layer for Specialized 3x3 Systems."
|
||||
}
|
||||
},
|
||||
{
|
||||
"ContentPackId": "hypertwist/square-1-systems/other",
|
||||
"Title": "Square-1 Systems · Other",
|
||||
"Version": "2026.05.rewrite.01",
|
||||
"PuzzleFamily": "Other",
|
||||
"NotationProfile": "square-1-standard",
|
||||
"TrackManifests": [
|
||||
{
|
||||
"TrackId": "square-1-systems",
|
||||
"Title": "Square-1 Systems",
|
||||
"Goal": "Practice Square-1 shape and finish systems through normalized case ladders and first-party wording.",
|
||||
"DeckImportSpecIds": [
|
||||
"import/cubingapp-algorithm-case-deck-sq1-csp-1-slash",
|
||||
"import/cubingapp-algorithm-case-deck-sq1-csp-2-slashes",
|
||||
"import/cubingapp-algorithm-case-deck-sq1-csp-3-slashes",
|
||||
"import/cubingapp-algorithm-case-deck-sq1-csp-4-slashes",
|
||||
"import/cubingapp-algorithm-case-deck-sq1-csp-5-slashes",
|
||||
"import/cubingapp-algorithm-case-deck-sq1-csp-6-slashes",
|
||||
"import/cubingapp-algorithm-case-deck-sq1-csp-7-slashes",
|
||||
"import/cubingapp-algorithm-case-deck-sq1-obl-1-slash",
|
||||
"import/cubingapp-algorithm-case-deck-sq1-obl-2-slashes",
|
||||
"import/cubingapp-algorithm-case-deck-sq1-obl-3-slashes",
|
||||
"import/cubingapp-algorithm-case-deck-sq1-obl-4-slashes",
|
||||
"import/cubingapp-algorithm-case-deck-sq1-obl-5-slashes",
|
||||
"import/cubingapp-algorithm-case-deck-sq1-obl-6-slashes",
|
||||
"import/speedcubedb-algorithm-case-deck-sq1co-sq1",
|
||||
"import/speedcubedb-algorithm-case-deck-sq1cp-sq1",
|
||||
"import/speedcubedb-algorithm-case-deck-sq1cs-1-slice",
|
||||
"import/speedcubedb-algorithm-case-deck-sq1cs-2-slices",
|
||||
"import/speedcubedb-algorithm-case-deck-sq1cs-3-slices",
|
||||
"import/speedcubedb-algorithm-case-deck-sq1cs-4-slices",
|
||||
"import/speedcubedb-algorithm-case-deck-sq1cs-5-slices",
|
||||
"import/speedcubedb-algorithm-case-deck-sq1cs-6-slices",
|
||||
"import/speedcubedb-algorithm-case-deck-sq1cs-7-slices",
|
||||
"import/speedcubedb-algorithm-case-deck-sq1eo-sq1",
|
||||
"import/speedcubedb-algorithm-case-deck-sq1ep-sq1",
|
||||
"import/speedcubedb-algorithm-case-deck-sq1linparitypll-sq1",
|
||||
"import/speedcubedb-algorithm-case-deck-sq1linpll-sq1",
|
||||
"import/speedcubedb-algorithm-case-deck-sq1linpll1-sq1",
|
||||
"import/speedcubedb-algorithm-case-deck-sq1parity-sq1"
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "square-1-systems",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party authored track manifest for Square-1 Systems based on retained and rewritten course surfaces."
|
||||
}
|
||||
}
|
||||
],
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "FirstParty",
|
||||
"SourceRepo": "HyperTwist rewritten course layer",
|
||||
"SourceLicense": "first-party-authored",
|
||||
"SourceTrackId": "",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "First-party materialized content pack authored from the rewritten HyperTwist course layer for Square-1 Systems."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,365 @@
|
|||
{
|
||||
"generated_at": "2026-05-01T17:38:14.541Z",
|
||||
"reference_targets": [
|
||||
{
|
||||
"ReferenceTargetId": "reference/speedcubedb-course-reference-page-speedcubedb-root",
|
||||
"SurfaceType": "course-reference",
|
||||
"TrackTitle": "Advanced 3x3 Systems",
|
||||
"ItemTitle": "Speedcubedb Root",
|
||||
"IncorporationChannel": "course-reference-supplement",
|
||||
"TargetAssetFamily": "reference-page",
|
||||
"PuzzleFamily": "ClassicCube",
|
||||
"NotationProfile": "classic-wca",
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "DirectDonor",
|
||||
"SourceRepo": "SpeedCubeDB",
|
||||
"SourceLicense": "retained-web-content",
|
||||
"SourceTrackId": "advanced-3x3-systems",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "Rewritten curriculum brief for Speedcubedb Root, preserving factual method structure while replacing donor page wording with first-party HyperTwist copy."
|
||||
},
|
||||
"PreserveFactualElements": [
|
||||
"topic scope",
|
||||
"page role",
|
||||
"factual software or method semantics"
|
||||
],
|
||||
"RewriteRequiredElements": [
|
||||
"page title",
|
||||
"all instructional/reference prose"
|
||||
],
|
||||
"ContentSourceFile": "./raw-extracts/httrack-retained-reference-pages.jsonl",
|
||||
"MatchFilter": {
|
||||
"source": "speedcubedb",
|
||||
"source_scope": "httrack-retained",
|
||||
"structure_template": "course-reference-page",
|
||||
"family": "speedcubedb-root",
|
||||
"subset": null
|
||||
},
|
||||
"MaterializationNotes": [
|
||||
"Rewritten curriculum brief for Speedcubedb Root, preserving factual method structure while replacing donor page wording with first-party HyperTwist copy.",
|
||||
"Reference/manual surfaces remain rewritten first-party content targets, not copied donor pages."
|
||||
]
|
||||
},
|
||||
{
|
||||
"ReferenceTargetId": "reference/speedcubedb-tool-reference-page-speedcubedb-root",
|
||||
"SurfaceType": "tool-reference",
|
||||
"TrackTitle": "Advanced 3x3 Systems",
|
||||
"ItemTitle": "Speedcubedb Root",
|
||||
"IncorporationChannel": "feature-reference",
|
||||
"TargetAssetFamily": "tool-note",
|
||||
"PuzzleFamily": "ClassicCube",
|
||||
"NotationProfile": "classic-wca",
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "DirectDonor",
|
||||
"SourceRepo": "SpeedCubeDB",
|
||||
"SourceLicense": "retained-web-content",
|
||||
"SourceTrackId": "advanced-3x3-systems",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "Feature-semantics reference for Speedcubedb Root, rewritten as first-party product guidance instead of donor utility-page copy."
|
||||
},
|
||||
"PreserveFactualElements": [
|
||||
"topic scope",
|
||||
"page role",
|
||||
"factual software or method semantics"
|
||||
],
|
||||
"RewriteRequiredElements": [
|
||||
"page title",
|
||||
"all instructional/reference prose"
|
||||
],
|
||||
"ContentSourceFile": "./raw-extracts/httrack-retained-reference-pages.jsonl",
|
||||
"MatchFilter": {
|
||||
"source": "speedcubedb",
|
||||
"source_scope": "httrack-retained",
|
||||
"structure_template": "tool-reference-page",
|
||||
"family": "speedcubedb-root",
|
||||
"subset": null
|
||||
},
|
||||
"MaterializationNotes": [
|
||||
"Feature-semantics reference for Speedcubedb Root, rewritten as first-party product guidance instead of donor utility-page copy.",
|
||||
"Reference/manual surfaces remain rewritten first-party content targets, not copied donor pages."
|
||||
]
|
||||
},
|
||||
{
|
||||
"ReferenceTargetId": "reference/superliminal-com-course-reference-page-magic-cube-4d-solution",
|
||||
"SurfaceType": "course-reference",
|
||||
"TrackTitle": "Hypercubing Software Manuals",
|
||||
"ItemTitle": "Magic Cube 4D Solution Notes",
|
||||
"IncorporationChannel": "course-reference-supplement",
|
||||
"TargetAssetFamily": "reference-page",
|
||||
"PuzzleFamily": "Hypercube",
|
||||
"NotationProfile": "family-specific",
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "DirectDonor",
|
||||
"SourceRepo": "superliminal.com",
|
||||
"SourceLicense": "retained-web-content",
|
||||
"SourceTrackId": "hypercubing-software-manuals",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "Rewritten curriculum brief for Magic Cube 4D Solution Notes, preserving factual method structure while replacing donor page wording with first-party HyperTwist copy."
|
||||
},
|
||||
"PreserveFactualElements": [
|
||||
"topic scope",
|
||||
"page role",
|
||||
"factual software or method semantics"
|
||||
],
|
||||
"RewriteRequiredElements": [
|
||||
"page title",
|
||||
"all instructional/reference prose"
|
||||
],
|
||||
"ContentSourceFile": "./raw-extracts/httrack-retained-reference-pages.jsonl",
|
||||
"MatchFilter": {
|
||||
"source": "superliminal.com",
|
||||
"source_scope": "httrack-retained",
|
||||
"structure_template": "course-reference-page",
|
||||
"family": "Magic Cube 4D",
|
||||
"subset": "solution"
|
||||
},
|
||||
"MaterializationNotes": [
|
||||
"Rewritten curriculum brief for Magic Cube 4D Solution Notes, preserving factual method structure while replacing donor page wording with first-party HyperTwist copy.",
|
||||
"Reference/manual surfaces remain rewritten first-party content targets, not copied donor pages."
|
||||
]
|
||||
},
|
||||
{
|
||||
"ReferenceTargetId": "reference/superliminal-com-software-manual-reference-page-magic-cube-4d",
|
||||
"SurfaceType": "software-manual",
|
||||
"TrackTitle": "Hypercubing Software Manuals",
|
||||
"ItemTitle": "Magic Cube 4D Manual",
|
||||
"IncorporationChannel": "software-manual-surface",
|
||||
"TargetAssetFamily": "manual-page",
|
||||
"PuzzleFamily": "Hypercube",
|
||||
"NotationProfile": "family-specific",
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "DirectDonor",
|
||||
"SourceRepo": "superliminal.com",
|
||||
"SourceLicense": "retained-web-content",
|
||||
"SourceTrackId": "hypercubing-software-manuals",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "Rewritten operational guide target for Magic Cube 4D Manual, preserving behavior and workflow semantics without reusing donor manual prose."
|
||||
},
|
||||
"PreserveFactualElements": [
|
||||
"topic scope",
|
||||
"page role",
|
||||
"factual software or method semantics"
|
||||
],
|
||||
"RewriteRequiredElements": [
|
||||
"page title",
|
||||
"all instructional/reference prose"
|
||||
],
|
||||
"ContentSourceFile": "./raw-extracts/httrack-retained-reference-pages.jsonl",
|
||||
"MatchFilter": {
|
||||
"source": "superliminal.com",
|
||||
"source_scope": "httrack-retained",
|
||||
"structure_template": "software-manual-reference-page",
|
||||
"family": "Magic Cube 4D",
|
||||
"subset": null
|
||||
},
|
||||
"MaterializationNotes": [
|
||||
"Rewritten operational guide target for Magic Cube 4D Manual, preserving behavior and workflow semantics without reusing donor manual prose.",
|
||||
"Reference/manual surfaces remain rewritten first-party content targets, not copied donor pages."
|
||||
]
|
||||
},
|
||||
{
|
||||
"ReferenceTargetId": "reference/superliminal-com-software-manual-reference-page-magic-cube-7d",
|
||||
"SurfaceType": "software-manual",
|
||||
"TrackTitle": "Hypercubing Software Manuals",
|
||||
"ItemTitle": "Magic Cube 7D Manual",
|
||||
"IncorporationChannel": "software-manual-surface",
|
||||
"TargetAssetFamily": "manual-page",
|
||||
"PuzzleFamily": "Hypercube",
|
||||
"NotationProfile": "family-specific",
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "DirectDonor",
|
||||
"SourceRepo": "superliminal.com",
|
||||
"SourceLicense": "retained-web-content",
|
||||
"SourceTrackId": "hypercubing-software-manuals",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "Rewritten operational guide target for Magic Cube 7D Manual, preserving behavior and workflow semantics without reusing donor manual prose."
|
||||
},
|
||||
"PreserveFactualElements": [
|
||||
"topic scope",
|
||||
"page role",
|
||||
"factual software or method semantics"
|
||||
],
|
||||
"RewriteRequiredElements": [
|
||||
"page title",
|
||||
"all instructional/reference prose"
|
||||
],
|
||||
"ContentSourceFile": "./raw-extracts/httrack-retained-reference-pages.jsonl",
|
||||
"MatchFilter": {
|
||||
"source": "superliminal.com",
|
||||
"source_scope": "httrack-retained",
|
||||
"structure_template": "software-manual-reference-page",
|
||||
"family": "Magic Cube 7D",
|
||||
"subset": null
|
||||
},
|
||||
"MaterializationNotes": [
|
||||
"Rewritten operational guide target for Magic Cube 7D Manual, preserving behavior and workflow semantics without reusing donor manual prose.",
|
||||
"Reference/manual surfaces remain rewritten first-party content targets, not copied donor pages."
|
||||
]
|
||||
},
|
||||
{
|
||||
"ReferenceTargetId": "reference/superliminal-com-software-manual-reference-page-magic-hyperbolic-tile",
|
||||
"SurfaceType": "software-manual",
|
||||
"TrackTitle": "Hypercubing Software Manuals",
|
||||
"ItemTitle": "Magic Hyperbolic Tile Manual",
|
||||
"IncorporationChannel": "software-manual-surface",
|
||||
"TargetAssetFamily": "manual-page",
|
||||
"PuzzleFamily": "Tiling",
|
||||
"NotationProfile": "family-specific",
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "DirectDonor",
|
||||
"SourceRepo": "superliminal.com",
|
||||
"SourceLicense": "retained-web-content",
|
||||
"SourceTrackId": "hypercubing-software-manuals",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "Rewritten operational guide target for Magic Hyperbolic Tile Manual, preserving behavior and workflow semantics without reusing donor manual prose."
|
||||
},
|
||||
"PreserveFactualElements": [
|
||||
"topic scope",
|
||||
"page role",
|
||||
"factual software or method semantics"
|
||||
],
|
||||
"RewriteRequiredElements": [
|
||||
"page title",
|
||||
"all instructional/reference prose"
|
||||
],
|
||||
"ContentSourceFile": "./raw-extracts/httrack-retained-reference-pages.jsonl",
|
||||
"MatchFilter": {
|
||||
"source": "superliminal.com",
|
||||
"source_scope": "httrack-retained",
|
||||
"structure_template": "software-manual-reference-page",
|
||||
"family": "Magic Hyperbolic Tile",
|
||||
"subset": null
|
||||
},
|
||||
"MaterializationNotes": [
|
||||
"Rewritten operational guide target for Magic Hyperbolic Tile Manual, preserving behavior and workflow semantics without reusing donor manual prose.",
|
||||
"Reference/manual surfaces remain rewritten first-party content targets, not copied donor pages."
|
||||
]
|
||||
},
|
||||
{
|
||||
"ReferenceTargetId": "reference/superliminal-com-software-manual-reference-page-magic-puzzle-ultimate",
|
||||
"SurfaceType": "software-manual",
|
||||
"TrackTitle": "Hypercubing Software Manuals",
|
||||
"ItemTitle": "Magic Puzzle Ultimate Manual",
|
||||
"IncorporationChannel": "software-manual-surface",
|
||||
"TargetAssetFamily": "manual-page",
|
||||
"PuzzleFamily": "Other",
|
||||
"NotationProfile": "family-specific",
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "DirectDonor",
|
||||
"SourceRepo": "superliminal.com",
|
||||
"SourceLicense": "retained-web-content",
|
||||
"SourceTrackId": "hypercubing-software-manuals",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "Rewritten operational guide target for Magic Puzzle Ultimate Manual, preserving behavior and workflow semantics without reusing donor manual prose."
|
||||
},
|
||||
"PreserveFactualElements": [
|
||||
"topic scope",
|
||||
"page role",
|
||||
"factual software or method semantics"
|
||||
],
|
||||
"RewriteRequiredElements": [
|
||||
"page title",
|
||||
"all instructional/reference prose"
|
||||
],
|
||||
"ContentSourceFile": "./raw-extracts/httrack-retained-reference-pages.jsonl",
|
||||
"MatchFilter": {
|
||||
"source": "superliminal.com",
|
||||
"source_scope": "httrack-retained",
|
||||
"structure_template": "software-manual-reference-page",
|
||||
"family": "Magic Puzzle Ultimate",
|
||||
"subset": null
|
||||
},
|
||||
"MaterializationNotes": [
|
||||
"Rewritten operational guide target for Magic Puzzle Ultimate Manual, preserving behavior and workflow semantics without reusing donor manual prose.",
|
||||
"Reference/manual surfaces remain rewritten first-party content targets, not copied donor pages."
|
||||
]
|
||||
},
|
||||
{
|
||||
"ReferenceTargetId": "reference/superliminal-com-software-manual-reference-page-magic-simplex-5d",
|
||||
"SurfaceType": "software-manual",
|
||||
"TrackTitle": "Hypercubing Software Manuals",
|
||||
"ItemTitle": "Magic Simplex 5D Manual",
|
||||
"IncorporationChannel": "software-manual-surface",
|
||||
"TargetAssetFamily": "manual-page",
|
||||
"PuzzleFamily": "Hypercube",
|
||||
"NotationProfile": "family-specific",
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "DirectDonor",
|
||||
"SourceRepo": "superliminal.com",
|
||||
"SourceLicense": "retained-web-content",
|
||||
"SourceTrackId": "hypercubing-software-manuals",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "Rewritten operational guide target for Magic Simplex 5D Manual, preserving behavior and workflow semantics without reusing donor manual prose."
|
||||
},
|
||||
"PreserveFactualElements": [
|
||||
"topic scope",
|
||||
"page role",
|
||||
"factual software or method semantics"
|
||||
],
|
||||
"RewriteRequiredElements": [
|
||||
"page title",
|
||||
"all instructional/reference prose"
|
||||
],
|
||||
"ContentSourceFile": "./raw-extracts/httrack-retained-reference-pages.jsonl",
|
||||
"MatchFilter": {
|
||||
"source": "superliminal.com",
|
||||
"source_scope": "httrack-retained",
|
||||
"structure_template": "software-manual-reference-page",
|
||||
"family": "Magic Simplex 5D",
|
||||
"subset": null
|
||||
},
|
||||
"MaterializationNotes": [
|
||||
"Rewritten operational guide target for Magic Simplex 5D Manual, preserving behavior and workflow semantics without reusing donor manual prose.",
|
||||
"Reference/manual surfaces remain rewritten first-party content targets, not copied donor pages."
|
||||
]
|
||||
},
|
||||
{
|
||||
"ReferenceTargetId": "reference/superliminal-wiki-historical-reference-page-hypercubing-reference",
|
||||
"SurfaceType": "historical-reference",
|
||||
"TrackTitle": "Hypercubing Reference",
|
||||
"ItemTitle": "Hypercubing Historical Reference",
|
||||
"IncorporationChannel": "historical-reference-supplement",
|
||||
"TargetAssetFamily": "history-note",
|
||||
"PuzzleFamily": "Hypercube",
|
||||
"NotationProfile": "hypercubing-standard",
|
||||
"SourceAttribution": {
|
||||
"SourceMode": "DirectDonor",
|
||||
"SourceRepo": "Superliminal Wiki",
|
||||
"SourceLicense": "retained-web-content",
|
||||
"SourceTrackId": "hypercubing-reference",
|
||||
"SourceDeckId": "",
|
||||
"SourceCaseId": "",
|
||||
"SourceNotes": "Historical and conceptual reference lane for hypercubing context, rewritten into concise HyperTwist-native background guidance."
|
||||
},
|
||||
"PreserveFactualElements": [
|
||||
"topic scope",
|
||||
"page role",
|
||||
"factual software or method semantics"
|
||||
],
|
||||
"RewriteRequiredElements": [
|
||||
"page title",
|
||||
"all instructional/reference prose"
|
||||
],
|
||||
"ContentSourceFile": "./raw-extracts/httrack-retained-reference-pages.jsonl",
|
||||
"MatchFilter": {
|
||||
"source": "superliminal-wiki",
|
||||
"source_scope": "httrack-retained",
|
||||
"structure_template": "historical-reference-page",
|
||||
"family": "hypercubing-reference",
|
||||
"subset": null
|
||||
},
|
||||
"MaterializationNotes": [
|
||||
"Historical and conceptual reference lane for hypercubing context, rewritten into concise HyperTwist-native background guidance.",
|
||||
"Reference/manual surfaces remain rewritten first-party content targets, not copied donor pages."
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -389,6 +389,17 @@ FHyperTwistContentPack UHyperTwistContractLibrary::MakeSampleFiveStyleContentPac
|
|||
return UHyperTwistTrainingCatalogLibrary::MakeFiveStyleStarterContentPack();
|
||||
}
|
||||
|
||||
FHyperTwistTrainingCatalogImportLoadReport UHyperTwistContractLibrary::MakeBundledCatalogMaterializationLoadReport()
|
||||
{
|
||||
FHyperTwistTrainingCatalogMaterializedBundle MaterializedBundle;
|
||||
FHyperTwistTrainingCatalogImportLoadReport LoadReport;
|
||||
UHyperTwistTrainingCatalogLibrary::LoadBundledCatalogMaterializationBundle(
|
||||
MaterializedBundle,
|
||||
LoadReport
|
||||
);
|
||||
return LoadReport;
|
||||
}
|
||||
|
||||
FHyperTwistTrainingRunState UHyperTwistContractLibrary::MakeSampleTrainingRunState()
|
||||
{
|
||||
const FHyperTwistContentPack ContentPack = MakeSampleAlgTrainerContentPack();
|
||||
|
|
|
|||
|
|
@ -1,9 +1,115 @@
|
|||
#include "HyperTwistTraining/HyperTwistTrainingCatalogLibrary.h"
|
||||
|
||||
#include "HyperTwistTraining/HyperTwistTrainingLibrary.h"
|
||||
#include "JsonObjectConverter.h"
|
||||
#include "Misc/FileHelper.h"
|
||||
#include "Misc/Paths.h"
|
||||
|
||||
namespace HyperTwistTrainingCatalogLibraryInternal
|
||||
{
|
||||
template <typename TStruct>
|
||||
bool LoadStructFromJsonFile(
|
||||
const FString& JsonPath,
|
||||
TStruct& OutValue,
|
||||
TArray<FString>& InOutNotes,
|
||||
const FString& Label
|
||||
)
|
||||
{
|
||||
FString Json;
|
||||
if (!FPaths::FileExists(JsonPath))
|
||||
{
|
||||
InOutNotes.Add(FString::Printf(TEXT("%s missing: %s"), *Label, *JsonPath));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!FFileHelper::LoadFileToString(Json, *JsonPath))
|
||||
{
|
||||
InOutNotes.Add(FString::Printf(TEXT("%s could not be read: %s"), *Label, *JsonPath));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!FJsonObjectConverter::JsonObjectStringToUStruct(Json, &OutValue, 0, 0))
|
||||
{
|
||||
InOutNotes.Add(FString::Printf(TEXT("%s JSON could not be parsed into the expected import struct: %s"), *Label, *JsonPath));
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TryConvertImportedSourceMode(
|
||||
const FString& ImportedSourceMode,
|
||||
EHyperTwistTrainingSourceMode& OutSourceMode
|
||||
)
|
||||
{
|
||||
if (ImportedSourceMode.Equals(TEXT("FirstParty"), ESearchCase::IgnoreCase))
|
||||
{
|
||||
OutSourceMode = EHyperTwistTrainingSourceMode::FirstParty;
|
||||
return true;
|
||||
}
|
||||
if (ImportedSourceMode.Equals(TEXT("DirectDonor"), ESearchCase::IgnoreCase))
|
||||
{
|
||||
OutSourceMode = EHyperTwistTrainingSourceMode::DirectDonor;
|
||||
return true;
|
||||
}
|
||||
if (ImportedSourceMode.Equals(TEXT("CleanRoom"), ESearchCase::IgnoreCase))
|
||||
{
|
||||
OutSourceMode = EHyperTwistTrainingSourceMode::CleanRoom;
|
||||
return true;
|
||||
}
|
||||
if (ImportedSourceMode.Equals(TEXT("Benchmark"), ESearchCase::IgnoreCase))
|
||||
{
|
||||
OutSourceMode = EHyperTwistTrainingSourceMode::Benchmark;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool TryConvertImportedDeliveryMode(
|
||||
const FString& ImportedDeliveryMode,
|
||||
EHyperTwistTrainingDeliveryMode& OutDeliveryMode
|
||||
)
|
||||
{
|
||||
if (ImportedDeliveryMode.Equals(TEXT("Timer"), ESearchCase::IgnoreCase))
|
||||
{
|
||||
OutDeliveryMode = EHyperTwistTrainingDeliveryMode::Timer;
|
||||
return true;
|
||||
}
|
||||
if (ImportedDeliveryMode.Equals(TEXT("VirtualCube"), ESearchCase::IgnoreCase))
|
||||
{
|
||||
OutDeliveryMode = EHyperTwistTrainingDeliveryMode::VirtualCube;
|
||||
return true;
|
||||
}
|
||||
if (ImportedDeliveryMode.Equals(TEXT("SmartDevice"), ESearchCase::IgnoreCase))
|
||||
{
|
||||
OutDeliveryMode = EHyperTwistTrainingDeliveryMode::SmartDevice;
|
||||
return true;
|
||||
}
|
||||
if (ImportedDeliveryMode.Equals(TEXT("RecognitionAssisted"), ESearchCase::IgnoreCase))
|
||||
{
|
||||
OutDeliveryMode = EHyperTwistTrainingDeliveryMode::RecognitionAssisted;
|
||||
return true;
|
||||
}
|
||||
if (ImportedDeliveryMode.Equals(TEXT("CoachReviewed"), ESearchCase::IgnoreCase))
|
||||
{
|
||||
OutDeliveryMode = EHyperTwistTrainingDeliveryMode::CoachReviewed;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
int32 CountTrackManifests(const FHyperTwistTrainingCatalogContentPackManifestDocument& Document)
|
||||
{
|
||||
int32 Count = 0;
|
||||
for (const FHyperTwistTrainingCatalogImportedContentPackManifest& ContentPack : Document.content_packs)
|
||||
{
|
||||
Count += ContentPack.TrackManifests.Num();
|
||||
}
|
||||
return Count;
|
||||
}
|
||||
|
||||
bool HasTag(const TArray<FString>& Tags, const FString& Tag)
|
||||
{
|
||||
return Tags.ContainsByPredicate([&Tag](const FString& Candidate)
|
||||
|
|
@ -827,6 +933,337 @@ TArray<FHyperTwistContentPack> UHyperTwistTrainingCatalogLibrary::MakePhase3Trai
|
|||
};
|
||||
}
|
||||
|
||||
FString UHyperTwistTrainingCatalogLibrary::GetBundledCatalogMaterializationDirectory()
|
||||
{
|
||||
return FPaths::ConvertRelativePathToFull(
|
||||
FPaths::ProjectContentDir() / TEXT("HyperTwistTraining/MaterializedCatalog")
|
||||
);
|
||||
}
|
||||
|
||||
bool UHyperTwistTrainingCatalogLibrary::LoadCatalogMaterializationBundleFromDirectory(
|
||||
const FString& CatalogDirectory,
|
||||
FHyperTwistTrainingCatalogMaterializedBundle& OutBundle,
|
||||
FHyperTwistTrainingCatalogImportLoadReport& OutLoadReport
|
||||
)
|
||||
{
|
||||
OutBundle = FHyperTwistTrainingCatalogMaterializedBundle();
|
||||
OutLoadReport = FHyperTwistTrainingCatalogImportLoadReport();
|
||||
|
||||
const FString NormalizedDirectory = FPaths::ConvertRelativePathToFull(CatalogDirectory);
|
||||
OutLoadReport.CatalogDirectory = NormalizedDirectory;
|
||||
OutLoadReport.SummaryPath =
|
||||
FPaths::Combine(NormalizedDirectory, TEXT("hypertwist-catalog-materialization-summary.json"));
|
||||
OutLoadReport.ContentPackManifestPath =
|
||||
FPaths::Combine(NormalizedDirectory, TEXT("hypertwist-content-pack-manifests.json"));
|
||||
OutLoadReport.DeckImportSpecPath =
|
||||
FPaths::Combine(NormalizedDirectory, TEXT("hypertwist-deck-import-specs.json"));
|
||||
OutLoadReport.RuntimeContentBundlePath =
|
||||
FPaths::Combine(NormalizedDirectory, TEXT("hypertwist-runtime-content-bundles.json"));
|
||||
OutLoadReport.ReferenceTargetPath =
|
||||
FPaths::Combine(NormalizedDirectory, TEXT("hypertwist-reference-incorporation-targets.json"));
|
||||
|
||||
OutLoadReport.bLoadedSummary = HyperTwistTrainingCatalogLibraryInternal::LoadStructFromJsonFile(
|
||||
OutLoadReport.SummaryPath,
|
||||
OutBundle.Summary,
|
||||
OutLoadReport.Notes,
|
||||
TEXT("Materialized catalog summary")
|
||||
);
|
||||
OutLoadReport.bLoadedContentPackManifests = HyperTwistTrainingCatalogLibraryInternal::LoadStructFromJsonFile(
|
||||
OutLoadReport.ContentPackManifestPath,
|
||||
OutBundle.ContentPackManifests,
|
||||
OutLoadReport.Notes,
|
||||
TEXT("Content pack manifests")
|
||||
);
|
||||
OutLoadReport.bLoadedDeckImportSpecs = HyperTwistTrainingCatalogLibraryInternal::LoadStructFromJsonFile(
|
||||
OutLoadReport.DeckImportSpecPath,
|
||||
OutBundle.DeckImportSpecs,
|
||||
OutLoadReport.Notes,
|
||||
TEXT("Deck import specs")
|
||||
);
|
||||
OutLoadReport.bLoadedRuntimeBundles = HyperTwistTrainingCatalogLibraryInternal::LoadStructFromJsonFile(
|
||||
OutLoadReport.RuntimeContentBundlePath,
|
||||
OutBundle.RuntimeContentBundles,
|
||||
OutLoadReport.Notes,
|
||||
TEXT("Runtime content bundles")
|
||||
);
|
||||
OutLoadReport.bLoadedReferenceTargets = HyperTwistTrainingCatalogLibraryInternal::LoadStructFromJsonFile(
|
||||
OutLoadReport.ReferenceTargetPath,
|
||||
OutBundle.ReferenceTargets,
|
||||
OutLoadReport.Notes,
|
||||
TEXT("Reference incorporation targets")
|
||||
);
|
||||
|
||||
if (OutLoadReport.bLoadedContentPackManifests)
|
||||
{
|
||||
OutLoadReport.LoadedContentPackCount = OutBundle.ContentPackManifests.content_packs.Num();
|
||||
OutLoadReport.LoadedTrackManifestCount =
|
||||
HyperTwistTrainingCatalogLibraryInternal::CountTrackManifests(OutBundle.ContentPackManifests);
|
||||
}
|
||||
if (OutLoadReport.bLoadedDeckImportSpecs)
|
||||
{
|
||||
OutLoadReport.LoadedDeckImportSpecCount = OutBundle.DeckImportSpecs.deck_import_specs.Num();
|
||||
}
|
||||
if (OutLoadReport.bLoadedRuntimeBundles)
|
||||
{
|
||||
OutLoadReport.LoadedRuntimeBundleCount = OutBundle.RuntimeContentBundles.runtime_content_bundles.Num();
|
||||
}
|
||||
if (OutLoadReport.bLoadedReferenceTargets)
|
||||
{
|
||||
OutLoadReport.LoadedReferenceTargetCount = OutBundle.ReferenceTargets.reference_targets.Num();
|
||||
}
|
||||
|
||||
if (OutLoadReport.bLoadedSummary)
|
||||
{
|
||||
OutLoadReport.bCountsMatchSummary =
|
||||
OutLoadReport.LoadedContentPackCount == OutBundle.Summary.counts.content_packs
|
||||
&& OutLoadReport.LoadedTrackManifestCount == OutBundle.Summary.counts.track_manifests
|
||||
&& OutLoadReport.LoadedDeckImportSpecCount == OutBundle.Summary.counts.deck_import_specs
|
||||
&& OutLoadReport.LoadedRuntimeBundleCount == OutBundle.Summary.counts.runtime_content_bundles
|
||||
&& OutLoadReport.LoadedReferenceTargetCount == OutBundle.Summary.counts.reference_targets;
|
||||
if (!OutLoadReport.bCountsMatchSummary)
|
||||
{
|
||||
OutLoadReport.Notes.Add(
|
||||
TEXT("Materialized catalog counts do not match the authored summary counts. Rebuild or resync the generated assets.")
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return OutLoadReport.IsStructurallyValid() && OutBundle.IsStructurallyValid();
|
||||
}
|
||||
|
||||
bool UHyperTwistTrainingCatalogLibrary::LoadBundledCatalogMaterializationBundle(
|
||||
FHyperTwistTrainingCatalogMaterializedBundle& OutBundle,
|
||||
FHyperTwistTrainingCatalogImportLoadReport& OutLoadReport
|
||||
)
|
||||
{
|
||||
return LoadCatalogMaterializationBundleFromDirectory(
|
||||
GetBundledCatalogMaterializationDirectory(),
|
||||
OutBundle,
|
||||
OutLoadReport
|
||||
);
|
||||
}
|
||||
|
||||
bool UHyperTwistTrainingCatalogLibrary::TryFindDeckImportSpecInMaterializedBundle(
|
||||
const FHyperTwistTrainingCatalogMaterializedBundle& MaterializedBundle,
|
||||
const FString& DeckId,
|
||||
FHyperTwistTrainingCatalogDeckImportSpec& OutDeckImportSpec
|
||||
)
|
||||
{
|
||||
OutDeckImportSpec = FHyperTwistTrainingCatalogDeckImportSpec();
|
||||
if (!MaterializedBundle.IsStructurallyValid() || DeckId.IsEmpty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
for (const FHyperTwistTrainingCatalogDeckImportSpec& DeckImportSpec : MaterializedBundle.DeckImportSpecs.deck_import_specs)
|
||||
{
|
||||
if (DeckImportSpec.DeckId == DeckId || DeckImportSpec.DeckImportSpecId == DeckId)
|
||||
{
|
||||
OutDeckImportSpec = DeckImportSpec;
|
||||
return OutDeckImportSpec.IsStructurallyValid();
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool UHyperTwistTrainingCatalogLibrary::TryFindRuntimeContentBundleForDeckImportSpec(
|
||||
const FHyperTwistTrainingCatalogMaterializedBundle& MaterializedBundle,
|
||||
const FHyperTwistTrainingCatalogDeckImportSpec& DeckImportSpec,
|
||||
FHyperTwistTrainingCatalogRuntimeContentBundle& OutRuntimeBundle
|
||||
)
|
||||
{
|
||||
OutRuntimeBundle = FHyperTwistTrainingCatalogRuntimeContentBundle();
|
||||
if (!MaterializedBundle.IsStructurallyValid() || !DeckImportSpec.IsStructurallyValid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
for (const FHyperTwistTrainingCatalogRuntimeContentBundle& RuntimeBundle
|
||||
: MaterializedBundle.RuntimeContentBundles.runtime_content_bundles)
|
||||
{
|
||||
if (RuntimeBundle.CaseBundleId == DeckImportSpec.CaseBundleId)
|
||||
{
|
||||
OutRuntimeBundle = RuntimeBundle;
|
||||
return OutRuntimeBundle.IsStructurallyValid();
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool UHyperTwistTrainingCatalogLibrary::TryFindReferenceTargetInMaterializedBundle(
|
||||
const FHyperTwistTrainingCatalogMaterializedBundle& MaterializedBundle,
|
||||
const FString& ReferenceTargetId,
|
||||
FHyperTwistTrainingCatalogReferenceTarget& OutReferenceTarget
|
||||
)
|
||||
{
|
||||
OutReferenceTarget = FHyperTwistTrainingCatalogReferenceTarget();
|
||||
if (!MaterializedBundle.IsStructurallyValid() || ReferenceTargetId.IsEmpty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
for (const FHyperTwistTrainingCatalogReferenceTarget& ReferenceTarget
|
||||
: MaterializedBundle.ReferenceTargets.reference_targets)
|
||||
{
|
||||
if (ReferenceTarget.ReferenceTargetId == ReferenceTargetId)
|
||||
{
|
||||
OutReferenceTarget = ReferenceTarget;
|
||||
return OutReferenceTarget.IsStructurallyValid();
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool UHyperTwistTrainingCatalogLibrary::TryConvertImportedSourceAttribution(
|
||||
const FHyperTwistTrainingCatalogImportedSourceAttribution& ImportedAttribution,
|
||||
FHyperTwistTrainingSourceAttribution& OutSourceAttribution
|
||||
)
|
||||
{
|
||||
OutSourceAttribution = FHyperTwistTrainingSourceAttribution();
|
||||
if (!ImportedAttribution.IsStructurallyValid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!HyperTwistTrainingCatalogLibraryInternal::TryConvertImportedSourceMode(
|
||||
ImportedAttribution.SourceMode,
|
||||
OutSourceAttribution.SourceMode))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
OutSourceAttribution.SourceRepo = ImportedAttribution.SourceRepo;
|
||||
OutSourceAttribution.SourceLicense = ImportedAttribution.SourceLicense;
|
||||
OutSourceAttribution.SourceTrackId = ImportedAttribution.SourceTrackId;
|
||||
OutSourceAttribution.SourceDeckId = ImportedAttribution.SourceDeckId;
|
||||
OutSourceAttribution.SourceCaseId = ImportedAttribution.SourceCaseId;
|
||||
OutSourceAttribution.SourceNotes = ImportedAttribution.SourceNotes;
|
||||
return OutSourceAttribution.IsStructurallyValid();
|
||||
}
|
||||
|
||||
bool UHyperTwistTrainingCatalogLibrary::TryConvertImportedPromptKind(
|
||||
const FString& ImportedPromptKind,
|
||||
EHyperTwistTrainingPromptKind& OutPromptKind
|
||||
)
|
||||
{
|
||||
if (ImportedPromptKind.Equals(TEXT("Algorithm"), ESearchCase::IgnoreCase))
|
||||
{
|
||||
OutPromptKind = EHyperTwistTrainingPromptKind::Algorithm;
|
||||
return true;
|
||||
}
|
||||
if (ImportedPromptKind.Equals(TEXT("State"), ESearchCase::IgnoreCase))
|
||||
{
|
||||
OutPromptKind = EHyperTwistTrainingPromptKind::State;
|
||||
return true;
|
||||
}
|
||||
if (ImportedPromptKind.Equals(TEXT("Recognition"), ESearchCase::IgnoreCase))
|
||||
{
|
||||
OutPromptKind = EHyperTwistTrainingPromptKind::Recognition;
|
||||
return true;
|
||||
}
|
||||
if (ImportedPromptKind.Equals(TEXT("Memo"), ESearchCase::IgnoreCase))
|
||||
{
|
||||
OutPromptKind = EHyperTwistTrainingPromptKind::Memo;
|
||||
return true;
|
||||
}
|
||||
if (ImportedPromptKind.Equals(TEXT("Sequence"), ESearchCase::IgnoreCase))
|
||||
{
|
||||
OutPromptKind = EHyperTwistTrainingPromptKind::Sequence;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool UHyperTwistTrainingCatalogLibrary::TryConvertImportedSelectionPolicy(
|
||||
const FString& ImportedSelectionPolicy,
|
||||
EHyperTwistTrainingSelectionPolicy& OutSelectionPolicy
|
||||
)
|
||||
{
|
||||
if (ImportedSelectionPolicy.Equals(TEXT("Uniform"), ESearchCase::IgnoreCase))
|
||||
{
|
||||
OutSelectionPolicy = EHyperTwistTrainingSelectionPolicy::Uniform;
|
||||
return true;
|
||||
}
|
||||
if (ImportedSelectionPolicy.Equals(TEXT("Weighted"), ESearchCase::IgnoreCase))
|
||||
{
|
||||
OutSelectionPolicy = EHyperTwistTrainingSelectionPolicy::Weighted;
|
||||
return true;
|
||||
}
|
||||
if (ImportedSelectionPolicy.Equals(TEXT("Spaced"), ESearchCase::IgnoreCase))
|
||||
{
|
||||
OutSelectionPolicy = EHyperTwistTrainingSelectionPolicy::Spaced;
|
||||
return true;
|
||||
}
|
||||
if (ImportedSelectionPolicy.Equals(TEXT("Scripted"), ESearchCase::IgnoreCase))
|
||||
{
|
||||
OutSelectionPolicy = EHyperTwistTrainingSelectionPolicy::Scripted;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool UHyperTwistTrainingCatalogLibrary::TryConvertImportedDeliveryModes(
|
||||
const TArray<FString>& ImportedDeliveryModes,
|
||||
TArray<EHyperTwistTrainingDeliveryMode>& OutDeliveryModes
|
||||
)
|
||||
{
|
||||
OutDeliveryModes.Reset();
|
||||
if (ImportedDeliveryModes.Num() == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
for (const FString& ImportedDeliveryMode : ImportedDeliveryModes)
|
||||
{
|
||||
EHyperTwistTrainingDeliveryMode ConvertedMode = EHyperTwistTrainingDeliveryMode::Timer;
|
||||
if (!HyperTwistTrainingCatalogLibraryInternal::TryConvertImportedDeliveryMode(
|
||||
ImportedDeliveryMode,
|
||||
ConvertedMode))
|
||||
{
|
||||
OutDeliveryModes.Reset();
|
||||
return false;
|
||||
}
|
||||
|
||||
OutDeliveryModes.AddUnique(ConvertedMode);
|
||||
}
|
||||
|
||||
return OutDeliveryModes.Num() > 0;
|
||||
}
|
||||
|
||||
bool UHyperTwistTrainingCatalogLibrary::TryConvertImportedPuzzleFamily(
|
||||
const FString& ImportedPuzzleFamily,
|
||||
EHyperTwistPuzzleFamily& OutPuzzleFamily
|
||||
)
|
||||
{
|
||||
if (ImportedPuzzleFamily.Equals(TEXT("ClassicCube"), ESearchCase::IgnoreCase))
|
||||
{
|
||||
OutPuzzleFamily = EHyperTwistPuzzleFamily::ClassicCube;
|
||||
return true;
|
||||
}
|
||||
if (ImportedPuzzleFamily.Equals(TEXT("Hypercube"), ESearchCase::IgnoreCase))
|
||||
{
|
||||
OutPuzzleFamily = EHyperTwistPuzzleFamily::Hypercube;
|
||||
return true;
|
||||
}
|
||||
if (ImportedPuzzleFamily.Equals(TEXT("Tiling"), ESearchCase::IgnoreCase))
|
||||
{
|
||||
OutPuzzleFamily = EHyperTwistPuzzleFamily::Tiling;
|
||||
return true;
|
||||
}
|
||||
if (ImportedPuzzleFamily.Equals(TEXT("Other"), ESearchCase::IgnoreCase))
|
||||
{
|
||||
OutPuzzleFamily = EHyperTwistPuzzleFamily::Other;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool UHyperTwistTrainingCatalogLibrary::TryFindDeckInCatalog(
|
||||
const TArray<FHyperTwistContentPack>& TrainingCatalog,
|
||||
const FString& DeckId,
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
#include "HyperTwistReplay/HyperTwistReplayReviewLibrary.h"
|
||||
#include "HyperTwistRecognition/HyperTwistRecognitionTypes.h"
|
||||
#include "HyperTwistTraining/HyperTwistTrainingCoachLibrary.h"
|
||||
#include "HyperTwistTraining/HyperTwistTrainingCatalogImportTypes.h"
|
||||
#include "HyperTwistTraining/HyperTwistTrainingTypes.h"
|
||||
#include "HyperTwistContractLibrary.generated.h"
|
||||
|
||||
|
|
@ -65,6 +66,9 @@ public:
|
|||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
|
||||
static FHyperTwistContentPack MakeSampleFiveStyleContentPack();
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Catalog")
|
||||
static FHyperTwistTrainingCatalogImportLoadReport MakeBundledCatalogMaterializationLoadReport();
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
|
||||
static FHyperTwistTrainingRunState MakeSampleTrainingRunState();
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,551 @@
|
|||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "HyperTwistTrainingCatalogImportTypes.generated.h"
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct FHyperTwistTrainingCatalogImportedSourceAttribution
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString SourceMode;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString SourceRepo;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString SourceLicense;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString SourceTrackId;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString SourceDeckId;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString SourceCaseId;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString SourceNotes;
|
||||
|
||||
bool IsStructurallyValid() const
|
||||
{
|
||||
return !SourceMode.IsEmpty();
|
||||
}
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct FHyperTwistTrainingCatalogImportedTrackManifest
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString TrackId;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString Title;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString Goal;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FString> DeckImportSpecIds;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FHyperTwistTrainingCatalogImportedSourceAttribution SourceAttribution;
|
||||
|
||||
bool IsStructurallyValid() const
|
||||
{
|
||||
return !TrackId.IsEmpty() && !Title.IsEmpty();
|
||||
}
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct FHyperTwistTrainingCatalogImportedContentPackManifest
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString ContentPackId;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString Title;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString Version;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString PuzzleFamily;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString NotationProfile;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FHyperTwistTrainingCatalogImportedTrackManifest> TrackManifests;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FHyperTwistTrainingCatalogImportedSourceAttribution SourceAttribution;
|
||||
|
||||
bool IsStructurallyValid() const
|
||||
{
|
||||
return !ContentPackId.IsEmpty() && !Title.IsEmpty() && !PuzzleFamily.IsEmpty();
|
||||
}
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct FHyperTwistTrainingCatalogContentPackManifestDocument
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString generated_at;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FHyperTwistTrainingCatalogImportedContentPackManifest> content_packs;
|
||||
|
||||
bool IsStructurallyValid() const
|
||||
{
|
||||
return !generated_at.IsEmpty() && content_packs.Num() > 0;
|
||||
}
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct FHyperTwistTrainingCatalogDeckImportSpec
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString DeckImportSpecId;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString ContentPackId;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString TrackId;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString DeckId;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString Title;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString GoalSummary;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString LearnerOutcome;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString PromptKind;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FString> DeliveryModes;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString SelectionPolicy;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString TimingPolicyTemplateId;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString DifficultyBand;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FString> Tags;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString SubsetId;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FHyperTwistTrainingCatalogImportedSourceAttribution SourceAttribution;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FString> PreserveFactualElements;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FString> RewriteRequiredElements;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString CaseBundleId;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString CaseBundleKind;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FString> MaterializationNotes;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bUsesRealScrambles = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bSupportsAlgorithmReveal = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bSupportsVirtualCube = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bSupportsSmartCube = false;
|
||||
|
||||
bool IsStructurallyValid() const
|
||||
{
|
||||
return !DeckImportSpecId.IsEmpty()
|
||||
&& !DeckId.IsEmpty()
|
||||
&& !Title.IsEmpty()
|
||||
&& !PromptKind.IsEmpty()
|
||||
&& !CaseBundleId.IsEmpty();
|
||||
}
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct FHyperTwistTrainingCatalogDeckImportSpecDocument
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString generated_at;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FHyperTwistTrainingCatalogDeckImportSpec> deck_import_specs;
|
||||
|
||||
bool IsStructurallyValid() const
|
||||
{
|
||||
return !generated_at.IsEmpty() && deck_import_specs.Num() > 0;
|
||||
}
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct FHyperTwistTrainingCatalogRuntimeBundleMatchFilter
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString source;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString source_scope;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString structure_template;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString family;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString subset;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString mode_id;
|
||||
|
||||
bool IsStructurallyValid() const
|
||||
{
|
||||
return !source.IsEmpty() && !source_scope.IsEmpty() && !structure_template.IsEmpty();
|
||||
}
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct FHyperTwistTrainingCatalogRuntimeBundleRetainedCounts
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 record_count = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 case_count = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 selector_count = 0;
|
||||
|
||||
bool IsStructurallyValid() const
|
||||
{
|
||||
return record_count >= 0 && case_count >= 0 && selector_count >= 0;
|
||||
}
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct FHyperTwistTrainingCatalogRuntimeContentBundle
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString CaseBundleId;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString BundleKind;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString ContentSourceFile;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FHyperTwistTrainingCatalogRuntimeBundleMatchFilter MatchFilter;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString PromptKind;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FHyperTwistTrainingCatalogRuntimeBundleRetainedCounts RetainedCounts;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString RuntimeMaterializationPolicy;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString Governance;
|
||||
|
||||
bool IsStructurallyValid() const
|
||||
{
|
||||
return !CaseBundleId.IsEmpty()
|
||||
&& !BundleKind.IsEmpty()
|
||||
&& !ContentSourceFile.IsEmpty()
|
||||
&& MatchFilter.IsStructurallyValid();
|
||||
}
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct FHyperTwistTrainingCatalogRuntimeContentBundleDocument
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString generated_at;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FHyperTwistTrainingCatalogRuntimeContentBundle> runtime_content_bundles;
|
||||
|
||||
bool IsStructurallyValid() const
|
||||
{
|
||||
return !generated_at.IsEmpty() && runtime_content_bundles.Num() > 0;
|
||||
}
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct FHyperTwistTrainingCatalogReferenceTarget
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString ReferenceTargetId;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString SurfaceType;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString TrackTitle;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString ItemTitle;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString IncorporationChannel;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString TargetAssetFamily;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString PuzzleFamily;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString NotationProfile;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FHyperTwistTrainingCatalogImportedSourceAttribution SourceAttribution;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FString> PreserveFactualElements;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FString> RewriteRequiredElements;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString ContentSourceFile;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FHyperTwistTrainingCatalogRuntimeBundleMatchFilter MatchFilter;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FString> MaterializationNotes;
|
||||
|
||||
bool IsStructurallyValid() const
|
||||
{
|
||||
return !ReferenceTargetId.IsEmpty()
|
||||
&& !SurfaceType.IsEmpty()
|
||||
&& !ItemTitle.IsEmpty()
|
||||
&& !IncorporationChannel.IsEmpty();
|
||||
}
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct FHyperTwistTrainingCatalogReferenceTargetDocument
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString generated_at;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FHyperTwistTrainingCatalogReferenceTarget> reference_targets;
|
||||
|
||||
bool IsStructurallyValid() const
|
||||
{
|
||||
return !generated_at.IsEmpty() && reference_targets.Num() > 0;
|
||||
}
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct FHyperTwistTrainingCatalogMaterializationCounts
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 content_packs = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 track_manifests = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 deck_import_specs = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 runtime_content_bundles = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 reference_targets = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 overlap_pruned_exclusions = 0;
|
||||
|
||||
bool IsStructurallyValid() const
|
||||
{
|
||||
return content_packs >= 0
|
||||
&& track_manifests >= 0
|
||||
&& deck_import_specs >= 0
|
||||
&& runtime_content_bundles >= 0
|
||||
&& reference_targets >= 0
|
||||
&& overlap_pruned_exclusions >= 0;
|
||||
}
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct FHyperTwistTrainingCatalogMaterializationSummary
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString generated_at;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString slice;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString slice_status;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FHyperTwistTrainingCatalogMaterializationCounts counts;
|
||||
|
||||
bool IsStructurallyValid() const
|
||||
{
|
||||
return !generated_at.IsEmpty()
|
||||
&& !slice.IsEmpty()
|
||||
&& !slice_status.IsEmpty()
|
||||
&& counts.IsStructurallyValid();
|
||||
}
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct FHyperTwistTrainingCatalogMaterializedBundle
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FHyperTwistTrainingCatalogMaterializationSummary Summary;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FHyperTwistTrainingCatalogContentPackManifestDocument ContentPackManifests;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FHyperTwistTrainingCatalogDeckImportSpecDocument DeckImportSpecs;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FHyperTwistTrainingCatalogRuntimeContentBundleDocument RuntimeContentBundles;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FHyperTwistTrainingCatalogReferenceTargetDocument ReferenceTargets;
|
||||
|
||||
bool IsStructurallyValid() const
|
||||
{
|
||||
return Summary.IsStructurallyValid()
|
||||
&& ContentPackManifests.IsStructurallyValid()
|
||||
&& DeckImportSpecs.IsStructurallyValid()
|
||||
&& RuntimeContentBundles.IsStructurallyValid()
|
||||
&& ReferenceTargets.IsStructurallyValid();
|
||||
}
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct FHyperTwistTrainingCatalogImportLoadReport
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString CatalogDirectory;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString SummaryPath;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString ContentPackManifestPath;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString DeckImportSpecPath;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString RuntimeContentBundlePath;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString ReferenceTargetPath;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 LoadedContentPackCount = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 LoadedTrackManifestCount = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 LoadedDeckImportSpecCount = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 LoadedRuntimeBundleCount = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 LoadedReferenceTargetCount = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bLoadedSummary = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bLoadedContentPackManifests = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bLoadedDeckImportSpecs = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bLoadedRuntimeBundles = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bLoadedReferenceTargets = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bCountsMatchSummary = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FString> Notes;
|
||||
|
||||
bool IsStructurallyValid() const
|
||||
{
|
||||
return bLoadedSummary
|
||||
&& bLoadedContentPackManifests
|
||||
&& bLoadedDeckImportSpecs
|
||||
&& bLoadedRuntimeBundles
|
||||
&& bLoadedReferenceTargets;
|
||||
}
|
||||
};
|
||||
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include "CoreMinimal.h"
|
||||
#include "Kismet/BlueprintFunctionLibrary.h"
|
||||
#include "HyperTwistTraining/HyperTwistTrainingCatalogImportTypes.h"
|
||||
#include "HyperTwistTraining/HyperTwistTrainingTypes.h"
|
||||
#include "HyperTwistTrainingCatalogLibrary.generated.h"
|
||||
|
||||
|
|
@ -23,6 +24,73 @@ public:
|
|||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Catalog")
|
||||
static TArray<FHyperTwistContentPack> MakePhase3TrainingCatalog();
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Catalog")
|
||||
static FString GetBundledCatalogMaterializationDirectory();
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Catalog")
|
||||
static bool LoadCatalogMaterializationBundleFromDirectory(
|
||||
const FString& CatalogDirectory,
|
||||
FHyperTwistTrainingCatalogMaterializedBundle& OutBundle,
|
||||
FHyperTwistTrainingCatalogImportLoadReport& OutLoadReport
|
||||
);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Catalog")
|
||||
static bool LoadBundledCatalogMaterializationBundle(
|
||||
FHyperTwistTrainingCatalogMaterializedBundle& OutBundle,
|
||||
FHyperTwistTrainingCatalogImportLoadReport& OutLoadReport
|
||||
);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Catalog")
|
||||
static bool TryFindDeckImportSpecInMaterializedBundle(
|
||||
const FHyperTwistTrainingCatalogMaterializedBundle& MaterializedBundle,
|
||||
const FString& DeckId,
|
||||
FHyperTwistTrainingCatalogDeckImportSpec& OutDeckImportSpec
|
||||
);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Catalog")
|
||||
static bool TryFindRuntimeContentBundleForDeckImportSpec(
|
||||
const FHyperTwistTrainingCatalogMaterializedBundle& MaterializedBundle,
|
||||
const FHyperTwistTrainingCatalogDeckImportSpec& DeckImportSpec,
|
||||
FHyperTwistTrainingCatalogRuntimeContentBundle& OutRuntimeBundle
|
||||
);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Catalog")
|
||||
static bool TryFindReferenceTargetInMaterializedBundle(
|
||||
const FHyperTwistTrainingCatalogMaterializedBundle& MaterializedBundle,
|
||||
const FString& ReferenceTargetId,
|
||||
FHyperTwistTrainingCatalogReferenceTarget& OutReferenceTarget
|
||||
);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Catalog")
|
||||
static bool TryConvertImportedSourceAttribution(
|
||||
const FHyperTwistTrainingCatalogImportedSourceAttribution& ImportedAttribution,
|
||||
FHyperTwistTrainingSourceAttribution& OutSourceAttribution
|
||||
);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Catalog")
|
||||
static bool TryConvertImportedPromptKind(
|
||||
const FString& ImportedPromptKind,
|
||||
EHyperTwistTrainingPromptKind& OutPromptKind
|
||||
);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Catalog")
|
||||
static bool TryConvertImportedSelectionPolicy(
|
||||
const FString& ImportedSelectionPolicy,
|
||||
EHyperTwistTrainingSelectionPolicy& OutSelectionPolicy
|
||||
);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Catalog")
|
||||
static bool TryConvertImportedDeliveryModes(
|
||||
const TArray<FString>& ImportedDeliveryModes,
|
||||
TArray<EHyperTwistTrainingDeliveryMode>& OutDeliveryModes
|
||||
);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Catalog")
|
||||
static bool TryConvertImportedPuzzleFamily(
|
||||
const FString& ImportedPuzzleFamily,
|
||||
EHyperTwistPuzzleFamily& OutPuzzleFamily
|
||||
);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Catalog")
|
||||
static bool TryFindDeckInCatalog(
|
||||
const TArray<FHyperTwistContentPack>& TrainingCatalog,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue