Add materialized catalog import bridge

This commit is contained in:
axiomlogicnexus 2026-05-01 19:55:42 +02:00
parent 3f5f6ff7ab
commit 23e81d1a96
10 changed files with 40829 additions and 0 deletions

View file

@ -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
}
}

View file

@ -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."
}
}
]
}

View file

@ -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."
]
}
]
}

View file

@ -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();

View file

@ -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,

View file

@ -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();

View file

@ -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;
}
};

View file

@ -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,