Ir al contenido
learn

Diario

  • Programa del curso: .NET 10, compilado contra el GA.Domain.Core de GA en un commit fijado
  • CI: la salida de cada lección comparada con su archivo esperado en tres sistemas operativos
  • Lección 1: notas, clases de altura y el mástil
  • Lección 2: escalas, modos e ids de escala de 12 bits
  • Lección 3: acordes, cifrados, inversiones y voicings
  • Lección 4: clases de conjuntos, vectores interválicos y la relación Z
  • Diagramas: brazaletes, diagramas de acordes, mástil y círculos de quintas dibujados por el programa del curso, comprobados por la CI
  • Lección 5: tonalidades, armaduras y el círculo de quintas
  • Lección 6: los acordes de una tonalidad
  • Lección 7: cadencias, ii–V–I y la tonalidad de una progresión
  • Lección 8: el ukelele y el bajo
  • Apéndice A: todos los instrumentos del catálogo de GA
  • Apéndice B: la jerarquía OPTIC
  • Apéndice C: un veredicto para cada línea DIFF de las lecciones 1 a 7
  • Lección 9: conducción de voces y notas comunes
  • Lección 10: sustituciones y mezcla modal
  • Lección 11: los modos en profundidad
  • Lección 12: la simetría y los modos de transposición limitada
  • Lección 13: los acordes extendidos y alterados
  • Lección 14: los voicings de guitarra, shells, drop 2 y drop 3
  • Lección 15: el mástil, CAGED, digitación y tocabilidad
  • Lección 16: arpegios, teoría acorde–escala e improvisación
  • Lección 17 (ver el plan en la página de la misión)

Las cuarenta divergencias entre la aritmética de este curso y la de Guitar Alchemist, los diecinueve defectos a los que se reducen y el veredicto de cada una están en el apéndice C; dieciséis se fusionaron aguas arriba en GA #711, y tres quedan como límites de diseño documentados. Esta tabla cubre lo que el apéndice no cubre: los hallazgos fuera de la comparación ejecutable de las lecciones 1 a 7. La fila de BraceletNotation se leyó en lugar de ejecutarse, y lo dice; las filas de las lecciones 9 a 12 salen de sus programas, que compilan archivos de GA, copian sus funciones tal cual o las reescriben, y cada fila dice cuál.

Esperado Lo que pasa Dónde Medición Estado
getAllInstruments() devuelve los instrumentos que contiene el YAML Devuelve uno, y dos afinaciones, cayendo sin error ni línea de registro en valores de guitarra escritos a mano InstrumentsYaml/InstrumentsConfig, GA.Business.Config en a826864 El archivo contiene 122 instrumentos y 280 afinaciones; el cargador devolvió 1 y 2. Siete de las 280 ni siquiera son alturas: dos entradas de pedal steel empiezan por el nombre de su afinación, una por la palabra Tuning, una por el nombre del instrumento, una conserva parte de su nombre Corregido upstream por #734, fusionada el 2026-09-24: el archivo se lee como un diccionario, 122 instrumentos y 280 afinaciones, y un fallo ahora lo dice en stderr en lugar de responder en silencio con la guitarra integrada. Nueve afinaciones se restauraron a partir de Tunings.txt; las dos entradas de arpa-guitarra conservan su `
Tuning.BuildPitchArray numera bien las cuerdas de cualquier afinación Decide qué extremo es la cuerda 1 comparando solo la primera altura con la última, así que una afinación reentrante sale al revés Tuning.BuildPitchArray en a826864 Las dos afinaciones de banjo de 5 cuerdas del propio GA, cuya prima va escrita primero y suena más aguda que la última, quedan numeradas al revés — en contra del comentario de Str, que dice que la cuerda 1 es la más aguda Corregido upstream por #734: el sentido se decide contando los pasos ascendentes y descendentes entre cuerdas vecinas, así que las dos afinaciones de banjo numeran la cuerda 1 como la más aguda 2026-09-15, 2026-09-24
El parámetro documentado de Fretboard.GetNote coincide con su indexación El comentario dice «Zero-based string index (0 = lowest string)» y el código indexa Tuning[stringIndex + 1], donde la cuerda 1 es la más aguda Fretboard.GetNote en a826864 El que se equivoca es el comentario, no el código Reproducido, solo documentación 2026-09-15
El ga_chord_to_set del servidor MCP deletrea el acorde que recibe Toma sus clases de altura de una closure de F# que guarda un intervalo por extensión y descarta las alteraciones, así que la escritura y el número de Forte salen mal DomainClosures.fs#L85-L98, servidor MCP de GA Cm7b5 da {C, Eb, G, Bb} y 4-26, donde lo correcto es 4-27 con sol♭; Cdim7 da 4-27 y «Scale: Major Seventh», donde lo correcto es 4-28 Corregido upstream por #681, fusionada el 2026-09-23. Relanzado sobre 27a1257: Cm7b5 da {C, Eb, F#, Bb} y 4-27, Cdim7 da 4-28 2026-09-14, 2026-09-24
ga_set_class_subs agrupa bajo la cualidad correcta los acordes que lista Todos caen bajo [maj], porque la prueba es c.EndsWith(""), cierta para cualquier cadena ChordAtonalTool.cs#L187-L190 Las listas en sí son correctas; solo la agrupación no lo es Corregido upstream por #681. Relanzado sobre 27a1257: las tríadas mayores bajo [maj], las menores bajo [m] 2026-09-14, 2026-09-24
ga_scale_by_id y ga_scale_by_name responden para una escala que GA conoce ga_scale_by_id(2741) devuelve Major con Forte Number: Some(n/a) donde se espera 7-35, y ga_scale_by_name("Dorian") no aparece servidor MCP de GA Un campo equivocado, una búsqueda que no encuentra Corregido upstream por #681. Relanzado sobre 27a1257: Forte Number: 7-35, y Dorian encontrado con el id 1709 2026-09-14, 2026-09-24
Toda herramienta MCP que recibe un acorde o una tonalidad responde Varias devuelven la cadena «An error occurred» en lugar de un error MCP servidor MCP de GA get_chord_voicings("C", maxFret 3), get_neighboring_keys y get_diatonic_chords("A minor") responden todas así; ga_search_voicings("C major open chord") ignoró la restricción «open» y devolvió 8-8-x-x-7-x Reproducido; el commit de build del servidor nunca se confirmó, así que estas filas no están fijadas a a826864 2026-09-14. Sobre 27a1257, get_neighboring_keys("Key of C") responde F, C, G; las otras tres necesitan GaApi y no se relanzaron 2026-09-24
ga_key_from_progression y ga_analyze_progression encuentran la tonalidad que establece una cadencia Contaban las fundamentales de los acordes en la escaA menor natural y preferían la del primer acorde: Dm7 G7 Cmaj7 daba D menor, Am Dm E7 Am A mayor GuitaristProblemTools.cs#L157-L223, DomainClosures.fs#L255-L336 Sobre 27a1257: Dm7 G7 Cmaj7 da C mayor, ii V I; Am Dm E7 Am da A menor, con E7 cifrado v y contado fuera de la tonalidad; Am F C G sigue poniendo A menor primero, empatada 4/4 con C mayor, en contra de la propia descripción de la herramienta Corregido upstream por #625, fusionada el 2026-09-24, para las dos cadencias; el cifrado y la descripción siguen, no reportados 2026-09-15, 2026-09-24
BraceletNotation.tsx coloca sus puntos sobre sus propios radios Los puntos se colocan en ángulo − 90° mientras los radios usan cos(ángulo) sin desfase, un cuarto de vuelta de diferencia; findSymmetryAxes además se salta los ejes que caen entre dos notas y cuenta cada eje dos veces ReactComponents/ga-react-components de GA Leído en el código, nunca ejecutado Reproducido por la prueba de #733, y corregido por ella, fusionada el 2026-09-24 2026-09-15, 2026-09-24
ga_common_tones y la habilidad CommonTones del chatbot nombran cada nota que comparten dos acordes Las dos llaman a la closure de F# domain.commonTones, que construye cada acorde a partir de la tríada de su calidad más un intervalo por extensión, sacado de una tabla de seis entradas, y descarta las alteraciones DomainClosures.fs#L85-L98, #L488-L531 El servidor en marcha el 2026-09-30 (versión no indicada): 5 de 7 pares pierden una nota — F en Bm7b5/G7, B en Cmaj9/Em7, A en Cdim7/F7 y en C6/Am7, B♭ en C9/Gm7 Corregido en la rama main de GA por #681, cuya chordTones alimenta ahora también domain.commonTones: leído en 5c3a52a, no ejecutado contra un servidor compilado después 2026-09-30
VoiceLeadingSkill devuelve la conducción de voces más pequeña, como dice su respuesta (“This is the optimal pitch-class assignment”) Iguala el tamaño de los acordes repitiendo siempre la fundamental del más pequeño VoiceLeadingSkill.cs#L131, #L185-L194 G → Cmaj7: 5 semitonos cuando existen 3, con B duplicada. 1260 de los 2880 pares tríada → séptima no alcanzan el mínimo, por hasta 4 semitonos, y otros tantos en el otro sentido Reproducido reescribiendo la regla en el programa del curso; el chatbot en sí no se ejecutó; no notificado 2026-09-30
Los diez ejemplos de consulta de la habilidad los lee su propio patrón «voice leading C major to G major» no coincide: el patrón quiere un cifrado de acorde justo antes de «to». La habilidad se elige por el significado (CanHandle devuelve false), así que recibiría esa consulta y respondería “Ask about voice leading between two chords” VoiceLeadingSkill.cs#L35-L57 1 ejemplo de 10 Reproducido con el patrón copiado tal cual; el chatbot en sí no se ejecutó; no notificado 2026-09-30
ga_voice_leading_pair empareja el voicing más corto “against its nearest neighbors”, como dice su comentario Ordena los dos voicings, los empareja desde abajo y cobra 3 semitonos por nota sobrante, así que un bajo añadido o quitado desplaza todas las voces CompositionTools.cs#L312-L336 G abierto → C abierto: 28 cuando existe 10; G7 abierto → C abierto: 28 cuando existe 8; xx2010 → x32010: 19 cuando existe 3. Su respuesta en marcha para G7 → C pone primero voicings cuyas notas de más están arriba, donde emparejar desde abajo es correcto Reproducido con la función copiada tal cual; no notificado 2026-09-30
VoiceLeadingSpace, con transposición pero sin equivalencia de octava, da la misma distancia en los dos sentidos Solo prueba transposiciones hacia arriba, de 0 a 11 semitonos VoiceLeadingSpace.cs#L46-L61 C4 mayor → B3 mayor 0, B3 mayor → C4 mayor 3; C4 mayor → C5 mayor 36, C5 mayor → C4 mayor 3, cuando 0 es lo correcto para los cuatro. Con equivalencia de octava, el atajo por desplazamientos cíclicos es exacto en todos los pares de conjuntos de 3 y de 4 notas Reproducido con el archivo de GA compilado tal cual; en a826864 solo lo llaman pruebas; no notificado 2026-09-30
SetClassOpticIndex.Distance entre dos clases de conjuntos del mismo tamaño es una distancia de conducción de voces, como en el artículo que cita Su comentario elige “the nearest-neighbor sum approach (approximation)”: cada nota va a la nota más cercana de la otra clase, así que varias voces pueden compartir una SetClassOpticIndex.cs#L53-L76, #L167-L224 En los 144 pares ordenados de las 12 clases de tricordios: 35 por debajo del mínimo uno a uno, 0 por encima, 70 que cambian al intercambiarlos; (012) → (048) da 2, (048) → (012) 6, uno a uno 6 Reproducido con el archivo de GA compilado tal cual; su único llamador fuera de las pruebas, ShapeGraphBuilder, solo lo usa si VoiceLeadingWeight es mayor que 0, y su valor por defecto es 0; no notificado 2026-09-30
La cita de SetClassOpticIndex lleva al artículo de Callender, Quinn y Tymoczko Da Music Theory Online 14(3) y un enlace de mtosmt.org que redirige a la página de error de la revista; el artículo está en Science 320 (2008), doi:10.1126/science.1153021 SetClassOpticIndex.cs#L15-L18 Enlace seguido el 2026-09-30 Reproducido, solo documentación; no notificado 2026-09-30
El ga_chord_substitutions del servidor MCP ordena los sustitutos diatónicos de un acorde en la tonalidad dada, o en la tonalidad del acorde, como muestra su descripción Sin tonalidad, la closure de F# toma la letra de la fundamental, descarta la alteración y supone mayor; el ejemplo de la descripción de la herramienta está mal en los tres acordes DomainClosures.fs#L558, GaDslTool.cs#L212 Am se compara con A mayor, que sale primero; F♯m con F mayor; E♭ con E mayor. Para Am en C mayor, la descripción dice C ★★★, Em ★★, F ★, donde la closure da C ★★, F ★★, Dm ★, Em ★ Reproducido reescribiendo la closure en el programa del curso; el servidor en sí no se ejecutó. Sin cambios en main (5c3a52a); no notificado 2026-10-01
La misma closure construye los acordes alterados y extendidos con todas sus notas Solo lee la calidad y las extensiones, en la tabla de seis entradas de la fila de ga_common_tones de la lección 9 DomainClosures.fs#L85-L98, #L603-L609 Bm7♭5 es B D F♯ A, así que Dm comparte 2 notas con él en lugar de 3; G9 y G13 se construyen sin su séptima, así que no tienen sustituto por tritono Corregido en la rama main de GA por #681: la closure toma sus notas de chordTones (#L663 en 5c3a52a); leído, no ejecutado 2026-10-01
ChordSubstitutionSkill llama dominante secundaria a un acorde cuando puede serlo La prueba solo compara las fundamentales: basta con una quinta de distancia ChordSubstitutionSkill.cs#L262 Dm → G y F♯ → Bdim reciben «Secondary Dominant», aunque Dm es menor y una tríada disminuida no se puede tonicizar Reproducido con la prueba copiada tal cual; el chatbot en sí no se ejecutó. Sin cambios en main; no notificado 2026-10-01
La lista de un acorde de la habilidad ordena los sustitutos por cercanía armónica, D♭7 entre los de G7, como promete su descripción Todos los acordes con el mismo vector interválico empatan a distancia 1, porque GrothendieckDelta.FromIcVs convierte una diferencia nula en 1, y la ordenación estable los deja en el orden de los números de 12 bits: la lista son los cinco números más pequeños de la clase de conjuntos del acorde GrothendieckDelta.cs#L125-L131, ChordSubstitutionSkill.cs#L164-L174 G7: Dm7♭5, A♭7, F7, D7, E♭m7♭5; D♭7 es el 19 de 155. Dm7♭5 sale primero para las 12 séptimas de dominante; Em7 y Am7 no aparecen para Cmaj7. El mismo cero convertido en uno hace de C un «ICV Neighbor (L1 = 1)» de sí mismo. GaApi sirve esta lógica como su propio ga_chord_substitutions Reproducido con GrothendieckService de GA compilado tal cual y la selección de la habilidad copiada; el chatbot en sí no se ejecutó. Sin cambios en main; no notificado 2026-10-01
Los doce ejemplos de consultas de la habilidad siguen el camino que ilustran «Alternative chord for F major in C» compara F con C; «Borrow a chord from parallel minor» no tiene cifrado de acorde, y la habilidad responde «Could not identify a chord symbol in your message.» ChordSubstitutionSkill.cs#L35-L55, #L144-L160 2 ejemplos de 12 Reproducido con el patrón copiado tal cual; el chatbot en sí no se ejecutó; no notificado 2026-10-01
get_borrowed_chords escribe y designa los acordes prestados como el manual Encuentra los 18 acordes del curso para C mayor, pero escribe cada fundamental de tecla negra con sostenido y los números romanos sin ♭, y atribuye cada acorde al primer modo de su bucle ContextualChordService.cs#L93-L109, #L137, #L157-L170 D♯ «III», A♯ «VII», G♯ «VI»; C♯ y D los dos «II»; C menor escrito C D♯ G; B♭ y G menor atribuidos al dórico, y el menor homónimo reducido a D disminuido Reproducido con el servicio compilado tal cual; no se ejecutaron ni la herramienta MCP ni GaApi. Sin cambios en main; no notificado 2026-10-01
ModalInterchange.yaml nombra bien los acordes prestados 4 de sus 13 acordes escritos y 3 de sus 6 números romanos cromáticos están mal, y su texto llega a YamlKnowledgeLoader, cuyas entradas guardaría YamlKnowledgeSyncService con embeddings si algún host lo registrara ModalInterchange.yaml#L271-L362, #L616-L619, #L826-L875, YamlKnowledgeLoader.fs#L128-L140, YamlKnowledgeSyncService.cs#L8-L25 VI F mayor, VII G mayor y III C mayor son acordes propios de A menor, no prestados de A mayor; «bii°, Bb diminished» no está en A frigio; ♭VI+, iv+ y el vii°7 de la menor melódica no están en sus modos. El cargador devuelve las 8 entradas del archivo con esas cadenas Reproducido, con el cargador compilado tal cual; en a826864 ningún host registra el servicio de sincronización y ningún código lee la colección; no notificado 2026-10-01
YamlKnowledgeLoader carga todos los YAML de contenido del directorio de configuración Se salta SpecializedTunings.yaml, que no se puede leer, y solo lo dice en la salida de error YamlKnowledgeLoader.fs#L116-L118 «While parsing a flow sequence, did not find expected ‘,’ or ‘]’.» Visto en la ejecución del programa del curso; el archivo en sí no se examinó 2026-10-01; la PR 808 de GA lo hace legible, y el cargador lee 21 entradas de él 2026-10-04
Modes.yaml declara el vector interválico de cada familia 9 de los 18 vectores declarados no son el vector de las notas de la familia, y GetAllModes da a cada modo el vector declarado por su familia Modes.yaml#L201-L202, #L248-L249, ModesConfig.fs#L281 La menor armónica declara <2 4 3 5 4 3> por <3 3 5 4 4 2>, la menor melódica <2 4 5 3 6 2> por <2 5 4 4 4 2>, la cromática <11 11 11 11 11 6> por <12 12 12 12 12 6>; también la pentatónica mayor, la de tonos enteros, la disminuida, el blues, la tríada aumentada y el acorde de séptima mayor Reproducido con ModesConfig compilado tal cual 2026-10-01. En main 75959835, 2 de los 18 aún diferían; la PR 818 de GA, aún sin fusionar, corrige el de la familia Augmented Triad y deja el de la familia Major Seventh Chord 2026-10-04
Los miembros de una familia de Modes.yaml son las rotaciones de su primer modo 60 de los 134 miembros no tienen su vector Modes.yaml, #L242-L247, #L465-L466 Familias enteras: Major Seventh Chord 7 de 7 (siete clases de acordes de séptima), All Interval Tetrachord 15 de 15, Hungarian Major 6 de 6, In Sen 4 de 4. La «primera inversión» de Diminished Triad, C E A, es A menor; el Ultralocrian está escrito como la escala alterada, con B♭ en lugar de B♭♭ Reproducido 2026-10-01. En main 75959835, 26 de los 134; la PR 818 de GA, aún sin fusionar, da a cada inversión de tríada las notas de su nombre y deja 22, sin tocar las familias Major Seventh Chord y All Interval Tetrachord 2026-10-04
ModesConfig devuelve los nombres que escribe Modes.yaml Un nombre sin comillas pierde todo lo que sigue a un «#» precedido de un espacio, que YAML lee como el comienzo de un comentario Modes.yaml#L631, #L639, #L655, #L663-L681 8 nombres de 165. 7 nombres pasan entonces a pertenecer a más de un modo, y una búsqueda por nombre devuelve el primero: «Lydian» es siempre el de la escala mayor, nunca «Lydian #2 #6» ni «Lydian #6» Reproducido por una prueba añadida después de la primera ejecución, en 13e7607 2026-10-01; corrección propuesta en la PR 818 de GA, aún sin fusionar 2026-10-04
TryGetModeByName, detrás de get_mode_info, encuentra un modo por sus nombres alternativos, como intenta su código Pasa por GetAllModes, que pone a None los nombres alternativos de cada modo ModesConfig.fs#L284, #L413-L441 0 de 165 modos los conservan, donde GetModalFamilies conserva 104: «Altered bb7», «Locrian Natural 6», «Super Locrian», «Acoustic Scale» y «Spanish Phrygian» no se encuentran. Tres de los nombres de las clases de modos de GA, «Locrian Natural 2», «Dorian Sharp 4» y «Lydian Sharp 2», no están en el archivo, e «Ionian Augmented» encuentra el «Ionian Augmented #2» cortado de la familia Double Harmonic, C D♯ E F G♯ A B Reproducido con ModesConfig compilado tal cual; la herramienta MCP no se ejecutó 2026-10-01; corrección propuesta en la PR 818 de GA, aún sin fusionar 2026-10-04
TryGetModeByIntervalClassVector, detrás de la línea «Scale:» de ga_chord_to_set y de los nombres de ga_icv_neighbors, nombra el conjunto que recibe Devuelve el primer modo cuya familia declara el vector, así que una declaración errónea oculta una escala, y el vector de una familia nombra siempre su primer modo ModesConfig.fs#L443-L458, ChordAtonalTool.cs#L112, #L249 Menor armónica, menor melódica y Cmaj7: nada. G7 y Bm7♭5: «Major Seventh». Cm: «Major Triad» Reproducido con ModesConfig compilado tal cual; las herramientas MCP no se ejecutaron 2026-10-01. La PR 818 de GA, aún sin fusionar, corrige el vector de la familia Augmented Triad: ga_chord_to_set("Caug") recibe la línea «Augmented Triad»; la búsqueda en sí no cambia 2026-10-04
IScaleDegreeNaming.ToShortName sigue una sola convención Tres: números de grado para la mayor y la mayor armónica, números romanos de las tríadas para las menores, e iv#4 e IV7 para el cuarto grado de las menores armónica y melódica MajorScaleDegree.cs#L64-L74, HarmonicMinorScaleDegree.cs#L67-L77, MelodicMinorScaleDegree.cs#L64-L74, HarmonicMajorScaleDegree.cs#L67-L77 11 de 35 nombres cortos difieren de la tríada de su grado Reproducido con los tipos de grado de GA; nada en GA llama al método en el commit a826864; no notificado 2026-10-01
PitchClassSet.StepBrightness “measures brightness based on the preponderance of large steps” Los pasos de un conjunto siempre suman 12, así que el valor es 2/n, una función del número de notas PitchClassSet.cs#L262-L283, ModalVectorService.cs#L157 0,2857 para los 21 modos de la mayor, la menor melódica y la menor armónica; 11 valores sobre los 4096 conjuntos, uno por tamaño, y 4 notas comparten 0,5 con 0 y 1 Reproducido; alimenta una dimensión de los embeddings; no notificado 2026-10-01
Una medida de brillo ordena el lidio por encima del locrio IcvBrightness, dimensión 21 del vector de estructura (índice 27 del embedding completo), lee el vector interválico, que comparten todos los modos de una escala TheoryVectorService.cs#L159-L172 0,642857 para cada modo de la mayor, 0,595238 para la menor melódica, 0,571429 para la menor armónica Reproducido con el método copiado tal cual; deliberado, ya que su comentario dice que sale del vector; no notificado 2026-10-01
UnifiedModeService.RankByBrightness ordena los modos de una escala Para la menor armónica ordena 14 conjuntos, modos de la mayor armónica incluidos, porque una ModalFamily agrupa los conjuntos por vector UnifiedModeService.cs#L228-L242, ModalFamily.cs#L108-L131 El lidio aumentado ♯2 de la mayor armónica primero, con 41; la mayor y la menor melódica como el curso Reproducido con el servicio compilado tal cual; solo las pruebas de GA lo llaman en el commit a826864. La causa es el defecto 6 del apéndice C, un diseño conocido 2026-10-01
UnifiedModeService.Describe nombra el modo de Messiaen de un conjunto que lo es IdentifyMessiaenMode compara el identificador de la forma prima con identificadores que, para los modos 4 a 7, no son formas primas; el del modo 6 es una forma del modo 4 UnifiedModeService.cs#L136, #L277-L347, UnifiedModeAdvancedTests.cs#L87-L119 Modos 1 a 3 encontrados, 4 a 7 no: GA prueba 2535, 2275, 3315 y 3055 donde las formas primas son 975, 455, 1495 y 2015. Las pruebas de GA para los modos 5 a 7 aceptan Is.Null Reproducido con el servicio compilado tal cual; no notificado 2026-10-01
Las tres clases de modos simétricos de GA listan cada modo distinto una vez, como los cuentan sus comentarios Items contiene un modo por grado, 6, 8 y 6, para 1, 2 y 2 conjuntos distintos; los comentarios prometen dos modos para la escala de tonos enteros y cuatro para la escala aumentada WholeToneScaleMode.cs#L12, AugmentedScaleMode.cs#L12, ModalCharacteristicIntervalService.cs#L114-L148 20 modos, 5 conjuntos distintos. TranspositionCount es correcto, 2, 3 y 4. ModalCharacteristicIntervalService los guarda en índices que se solapan, 208 a 215 escritos dos veces (leído, no ejecutado) Reproducido con las clases de GA; no notificado 2026-10-01
DiminishedScaleDegree.ToName nombra las dos escalas disminuidas por su primer paso Scale.Diminished empieza con un tono, y el grado 1 se llama «Half-whole diminished» DiminishedScaleDegree.cs#L47-L52, Scale.cs#L62 Grados 1 y 2 intercambiados; DiminishedScaleMode.HalfWhole es la escala tono-semitono. Modes.yaml nombra bien las mismas grafías Reproducido 2026-10-01; corrección propuesta en la PR 810 de GA, aún sin fusionar 2026-10-04
Scale.Tritone es la escala de tritono, las notas del acorde de Petrushka Tiene A donde la escala de tritono tiene B♭, y el comentario de TritoneScaleMode no describe ninguna de las dos Scale.cs#L67, TritoneScaleMode.cs#L11-L14 6-Z50 con 12 transposiciones y 6 modos, donde 6-30 tiene 6 y 3; el propio IsSymmetricSet de GA responde False. Las “alternating half steps and minor thirds” del comentario son la escala aumentada, y sus “two distinct modes” no encajan con ninguna Reproducido 2026-10-01; corrección propuesta en la PR 810 de GA, aún sin fusionar 2026-10-04
PitchClassSet.IsMonomodal y el IsSymmetric del catálogo atonal encuentran los conjuntos simétricos, como dicen sus comentarios y la dimensión de embedding «Is Symmetric/Monomodal» Los dos prueban una familia modal de un solo miembro PitchClassSet.cs#L186-L189, ModalVectorService.cs#L132, Program.cs#L249-L253 IsMonomodal: 29 conjuntos, 12 de ellos notas sueltas, 59 conjuntos limitados sin marcar, la escala octatónica de su propio comentario incluida. IsSymmetric: 6 familias de 200, la nota suelta incluida, 10 familias limitadas sin marcar Reproducido; no notificado 2026-10-01
AtonalChordAnalysisService.IsSymmetricalSet comprueba “equal divisions of the octave” Compara las distancias entre clases de altura ordenadas sin cerrar el círculo AtonalChordAnalysisService.cs#L217-L233, #L151-L183 156 conjuntos, entre ellos las 66 díadas, 140 no limitados; C D E True, B♭ C D False; 60 conjuntos limitados sin marcar. La rama de nombres que lo usa es inalcanzable, porque SetClass.IsModal es verdadero para los 4096 conjuntos Reproducido con el servicio compilado tal cual, el método privado llamado por reflexión 2026-10-01; corrección propuesta en la PR 810 de GA, aún sin fusionar 2026-10-04
ModesSkill lista los modos de transposición limitada cuando se le piden Lista las seis familias IsSymmetric con una confianza de 1,0, con los ordinales de ProgrammaticForteCatalog como números de Forte ModesSkill.cs#L596-L601, #L687-L705, ForteCatalog.cs#L9-L12 Una nota suelta en la lista, las escalas octatónica y hexatónica que nombra fuera de ella; «Forte 2-1», «3-1», «4-1», «6-1» por 2-6, 3-12, 4-28, 6-35. Las etiquetas del archivo coinciden con ForteCatalog en 4 familias de 200, aunque su comentario prohíbe mostrarlas Reproducido reconstruyendo la respuesta a partir de su formato y del cargador de GA; el chatbot en sí no se ejecutó. Las etiquetas son conocidas: GA #436 pasó el generador a ForteCatalog antes de a826864 y dejó para más adelante regenerar el archivo; la lista no está notificada 2026-10-01
Los catálogos de modos de GA nombran las clases simétricas AtonalModalFamilies.yaml toma nombres de familias de Modes.yaml que listan un conjunto por error; la búsqueda por vector encuentra el sexto modo de Messiaen con el nombre de la escala octatónica Modes.yaml#L328-L329, #L531, #L725-L726 El cuarto modo de Messiaen es «Major Bebop Family», la séptima disminuida «Major Seventh Chord Family»; el sexto modo de Messiaen es «Diminished (Half-Whole)», y la escala octatónica no se encuentra en ninguna parte Reproducido por una prueba añadida después de la primera ejecución, en 6b4039a; la herramienta MCP no se ejecutó; no notificado 2026-10-01
Chord.FromSymbol lee los cifrados de acordes que escriben los manuales y los propios archivos de GA Su tabla conoce los acordes extendidos, no los acordes alterados, los sus con extensión, add2, los acordes con barra ni la mayoría de las grafías; pasar a minúsculas convierte CM7 en m7 Chord.cs#L110-L141 14 de 41 cifrados bien; 28 rechazos, entre ellos las dos palabras; CM7 leído como séptima menor de C Reproducido 2026-10-02. La PR 820 de GA, aún sin fusionar, lee una M mayúscula como mayor: CM7 es la séptima mayor de C; las demás grafías siguen rechazadas 2026-10-04
ChordSymbolParser analiza los nombres de acordes de la búsqueda de voicings de GaApi y del chatbot Un sufijo que no está en su tabla cae en una cascada de pruebas Contains, y luego en una tríada mayor; las palabras inglesas que empiezan por una letra de A a G se analizan ChordSymbolParser.cs#L98-L140, #L176-L188, ChordSymbolParserTests.cs#L33-L40 17 de 41 bien, ningún rechazo; C7alt con quinta justa, C7#11 con séptima mayor, «Can» C mayor, «Give» G mayor. Las pruebas de GA solo comprueban que vuelve un acorde Reproducido con el parser compilado tal cual 2026-10-02; corrección propuesta en la PR 820 de GA, aún sin fusionar: 41 de 41 bien, «Can» y «Give» rechazados 2026-10-04
ChordFormula.GetSymbolSuffix nombra los acordes extendidos Escribe la letra de la cualidad y luego la extensión, así que la novena, la oncena y la trecena mayores pierden su «maj» ChordFormula.cs#L299-L325 8 de 11; BasicChordExtensionsService.GenerateChordName, a partir de la misma cualidad y la misma extensión, 11 de 11 Reproducido en a826864 2026-10-02; ya corregido aguas arriba por la PR 680 de GA, fusionada el 2026-09-17 2026-10-04
ChordAlterationService nombra los acordes alterados Las funciones salen de los semitonos módulo 12: la ♯9 se lee como una tercera, la ♯11 y la ♭13 como ♭5 y ♯5; una alteración hace de una dominante un «7alt», un semitono la convierte en acorde de novena ChordAlterationService.cs#L37-L61, #L87-L102, ChordFunctionExtensions.cs#L13-L22 Ninguno de los nueve acordes alterados del propio GA vuelve con su nombre; C7(♯9) tiene «No alterations»; Cdim, Caug, Cm7♭5 y Cdim7 reciben un (b5) o un (#5) Reproducido con el servicio compilado tal cual; no notificado 2026-10-02
ChordTemplateFactory.GenerateAllPossibleChords produce cada plantilla una vez Ejecuta GenerateFromAllModalFamilies, y luego los mismos tres grupos de escalas otra vez ChordTemplateFactory.cs#L37-L62, #L93-L115 25 900 plantillas, las últimas 12 950 una copia de las primeras Reproducido 2026-10-02; corrección propuesta en la PR 823 de GA, aún sin fusionar: 12 950 plantillas, cada una una vez 2026-10-04
La descripción de ga_polychord y AdvancedHarmony.yaml describen poliacordes B mayor sobre C no es el conjunto lidio, y C mayor sobre F♯ mayor da seis clases de altura, no doce ChordAtonalTool.cs#L194-L218, AdvancedHarmony.yaml#L101-L104 {C, Eb, E, F#, G, B}, 6-Z19, solo en el lidio ♯2; C/F♯ 6-30, el acorde de Petrushka, como lo lista IconicChords.yaml Reproducido con el código de la herramienta copiado y su closure F# reemplazada; no notificado 2026-10-02
VoicingHarmonicAnalyzer nombra los voicings drop Una sola prueba: subir la nota más grave una octava, y responder «Drop-2» cuando las notas caben entonces en una octava, nada si no. Las posiciones cerradas, los drop 3 y los drop 4 salen «Drop-2»; ningún voicing es nunca «Drop-3» VoicingHarmonicAnalyzer.cs#L46-L58 64 de los 128 voicings del curso «Drop-2», exactamente los que tienen como mucho una voz bajada; entre los 687 acordes de séptima en cuatro cuerdas de GA, «Drop-2» en 15 voicings cerrados, 111 drop 2, 92 drop 3 y 46 drop 4 Reproducido con el analizador compilado tal cual 2026-10-02; corrección propuesta en la PR 819 de GA, aún sin fusionar 2026-10-04
VoicingCharacteristics.IsRootless e IsOpenVoicing describen un voicing Analyze pasa intervalSpread > 12 y false VoicingHarmonicAnalyzer.cs#L38-L40, VoicingCharacteristics.cs#L10-L12 112 de 128 «rootless», todos con su fundamental; 672 de 687; los siete acordes abiertos de la lección 3; ningún voicing abierto Reproducido; no notificado 2026-10-02
VoicingFilters elige los voicings drop, sin fundamental, shell, cerrados y abiertos Drop3 y Drop2And4 buscan etiquetas que nada produce; Rootless, ClosedPosition y OpenPosition heredan los dos campos de arriba VoicingFilters.cs#L101-L124 Sobre los 687: Drop2 264, Drop3 0, Drop2And4 0, Rootless 672, ClosedPosition 687, OpenPosition 0. VoicingIndexingService aplica estos filtros antes de indexar Reproducido con los filtros compilados tal cual 2026-10-02. La PR 819 de GA, aún sin fusionar, corrige los tres filtros drop: sobre los 687, Drop2 111, Drop3 92, Drop2And4 143; Rootless, ClosedPosition y OpenPosition no cambian 2026-10-04
GA reconoce los shells, fundamental, tercera y séptima Tres reglas, ninguna sobre las notas del acorde: tres o cuatro cuerdas; «rootless» con tres clases de altura; «rootless» con tres notas VoicingPhysicalAnalyzer.cs#L126-L131, ChordClassificationEngine.cs#L169-L173, VoicingFilters.cs#L118-L119 Los shells en la quinta cuerda x323xx, x324xx y x313xx solo pasan la primera; las siete tríadas abiertas de la lección 3 reciben el shell-voicing del motor Reproducido 2026-10-02; corrección propuesta en la PR 819 de GA, aún sin fusionar 2026-10-04
VoicingAnalyzer.AnalyzeEnhanced registra las notas de un voicing y sus notas guía Construye new ToneInventory([], false, [], []) para cada voicing VoicingAnalyzer.cs#L155 711 análisis, HasGuideTones nunca verdadero; el «Shell» de AutoTaggingService depende de ello (leído, no ejecutado) Reproducido; no notificado 2026-10-02
Las digitaciones de GuitarCompingRecipes tocan los acordes que nombran Leídas de grave a agudo en sus grupos de cuerdas, como dicen las convenciones del archivo, ninguna lo hace; una tiene cinco trastes para cuatro cuerdas ChordProgressions.yaml#L461-L577 0 de 15; «Cm(maj9)» es un Cmaj7, «Gsus2» un Gsus4. YamlKnowledgeLoader devuelve las seis recetas para la recuperación Reproducido a través de YamlKnowledgeLoader; no notificado 2026-10-02
PHYSICAL_PLAYABILITY_IMPROVEMENTS.md cita las distancias de cinco trastes que calcula GA Sus tres distancias y su “71.4% larger” no coinciden ni con la calculadora de GA ni con la fórmula; el documento las presenta como la salida de una prueba, en un archivo que el proyecto de pruebas quita de la compilación PHYSICAL_PLAYABILITY_IMPROVEMENTS.md#L45-L50, #L155-L161, GA.Business.Core.Tests.csproj#L47 120,11, 85,42 y 70,09 mm frente a 162,55, 108,49 y 81,27 mm sobre 648 mm; la distancia de abajo un 100,0 % mayor que la de arriba Reproducido; no notificado 2026-10-02
ComfortableReachScaleUnits es una extensión de cuatro trastes Es la distancia de la cejuela al traste 4, comparada con la extensión entre notas pisadas, que cuenta un espacio de traste menos BiomechanicsConstants.cs#L24-L28, PhysicalCostService.cs#L27-L38 Cinco trastes desde el traste 1, diez desde el traste 12 Reproducido; no notificado 2026-10-02
DetectCagedShape nombra la forma CAGED de un voicing Devuelve null cuando la primera posición está apagada, antes de las pruebas de A y de C que la piden apagada, así que solo puede responder «E-Shape»; sus comentarios leen la primera posición como la cuerda 6, que GA numera cuerda 1 VoicingPhysicalAnalyzer.cs#L253-L343, #L27 En el orden de GA, ninguna de las 11 formas; invertida, la forma de E en 13 de 13 trastes y nada más. La etiqueta e-shape no pasa la prueba de VoicingFilterEngine para «E» Reproducido; no notificado 2026-10-02
Las medidas de tocabilidad de GA tienen en cuenta las cejillas y la mano del guitarrista PhysicalCostService no tiene término de cejilla; VoicingPhysicalAnalyzer no ve cejilla en F y clasifica el C abierto como «Intermediate»; BiomechanicalAnalyzer ve cejillas en las cuerdas al aire y puntúa F como «Very Easy»; ninguna lee HandSize ni MaxComfortableStretchMm PhysicalCostService.cs#L17-L142, VoicingPhysicalAnalyzer.cs#L105-L112, BiomechanicalAnalyzer.cs#L10-L12, #L153 F cuesta 0,29, las formas con cejilla de C de 0,21 a 0,24; el C abierto 3,50, «Intermediate»; F 0,92 frente a 0,82 del C abierto; los mismos resultados para los cuatro tamaños de mano Reproducido; no notificado 2026-10-02
Tunings.toml contiene las afinaciones de GA Ningún código C# o F# lo lee; repite los dos errores de octava de Instruments.yaml; el componente React que lo nombra ignora sus propiedades tunings y dataUrls Tunings.toml#L364-L366, #L388-L390, HarmonicNavigator3D.tsx#L128-L131 15 de 15 entradas como en Instruments.yaml; la cuerda 2 bajada 11 semitonos en OpenCMajor, 10 en OpenAMajor Reproducido, el archivo leído como texto; no notificado 2026-10-02
ga_easier_voicings ofrece voicings tocables del acorde pedido Dos formas de su tabla tocan una nota fuera de su acorde; con «no-barre» ofrece B7 y B5 para Bm y nada para B♭; el Fsus2 y el C/F de su descripción no están en la tabla GuitaristProblemTools.cs#L506-L562, #L574-L577, #L611-L652 Gsus4 310013 toca B♭, C5 x3500x B; ninguna oferta para Bm toca D Reproducido con la tabla leída como texto y la lectura del filtro por el curso; no notificado 2026-10-02
ga_arpeggio_suggestions da a cada acorde su arpegio y un modo que le sirva, como hace el ejemplo de su descripción Añade el sufijo de la tabla al símbolo entero y toma el modo del grado de la fundamental sola; cualquier palabra de tonalidad que no sea «minor» significa mayor GuitaristProblemTools.cs#L409-L412, #L426-L431, #L448-L485 «Amm7», «Dm7m7», «G77»; A7 en A mayor recibe el jónico, con G fuera; un acorde de A mayor en C mayor recibe «Am7» y el eólico, con C♯ fuera; la tonalidad «Am» es A mayor Reproducido con la herramienta leída como texto y la lectura de las líneas 426 a 485 por el curso; el sufijo y el grado corregidos upstream por GA #626 el 2026-09-24, la tonalidad leída como antes en main c1416eee (leído, no ejecutado) 2026-10-07
ImprovisationSkill.InferQuality lee la calidad que nombra un símbolo de acorde Pasa el sufijo a minúsculas, así que CM7 es una séptima menor, la regresión que los comentarios de ChordVocabulary dicen haber eliminado; Cmaj7♯5 se lee «major 7», C7♯11, C7♭13 y C7+5 «dominant 7»; el arpegio de Cm6 se llama CmMaj7 ImprovisationSkill.cs#L323, #L338-L351, ChordVocabulary.cs#L8-L16 7 de 31 símbolos reciben una primera escala sin una de sus notas; CM7 recibe Cm7, y luego dórico, eólico y frigio, ninguno con E ni B Reproducido, compilado; InferQuality sin cambios en main c1416eee; no notificado 2026-10-07
OutsideNotesSkill.Classify llama a una nota tensión o nota a evitar como lo hace la teoría acorde–escala Una sola regla para las doce notas, un semitono por encima de una nota del acorde, sin escala: las notas fuera de toda escala que sirva para el acorde se vuelven tensiones, la ♭9 y la ♭13 sobre una dominante notas a evitar; su consejo llama tensión alterada a la séptima mayor sobre una dominante OutsideNotesSkill.cs#L20-L28, #L141-L189 Sobre Cmaj7, B♭ «tension: b7» y E♭ «#9»; F♯ sobre Cm7 y A sobre Cm7♭5, todas fuera de las escalas de ImprovisationSkill para el acorde; sobre A7, D nota a evitar pero C, un semitono por debajo de C♯, tensión Reproducido, compilado; Classify sin cambios en main c1416eee; no notificado 2026-10-07

Preguntas cuya medición podía salir al revés. La primera es la red de seguridad del propio curso: su teoría se escribió a partir de definiciones publicadas, no de GA, de modo que coincidir con GA en los 4096 conjuntos dice algo sobre ambos.

Pregunta Hipótesis Resultado Veredicto Dónde
¿Coincide la forma prima de Rahn reescrita desde cero por el curso con la forma prima de identificador mínimo de GA, en todo el espacio? Construida a partir de Open Music Theory, Wikipedia y la OEIS, con independencia de GA: la coincidencia no estaba garantizada Coinciden para cada uno de los 4096 conjuntos. Las 224 clases de conjuntos y 352 clases de transposición de GA coinciden con OEIS A000029 y A000031. El empaquetado de Forte difiere del de Rahn en 6 clases de conjuntos y 17 de las 352 clases de transposición Confirmada, con la diferencia Forte/Rahn cuantificada aparte 2026-09-15
¿Subir la escalera OPTIC de GA una equivalencia cada vez sobre una digitación real llega a los recuentos del manual? Escrita de antemano: debería aterrizar en 4096, 352 y 224 4096, 352 y 224 Confirmada 2026-09-15
¿Cambia dar un parámetro de afinación a Diagrams.Fretboard los diagramas de guitarra ya producidos? Escrita de antemano: no — la guitarra es solo una afinación más entre las nuevas Los catorce archivos SVG existentes son idénticos byte a byte tras el cambio Confirmada 2026-09-15
¿Encuentra el núcleo de GA las mismas notas comunes que el curso en los 13 pares de la lección 9, Cmaj9, Cdim7 y C6 incluidos? Escrita de antemano: coincidencia en los 13 13 de 13 Confirmada 2026-09-30, Lesson11.cs#L62-L66
¿Con qué frecuencia repetir la fundamental del acorde más pequeño, como hace VoiceLeadingSkill, no alcanza la conducción de voces más pequeña? Escrita de antemano: G → Cmaj7 da 5 cuando existe 3; fallan más del 10 % de los 2880 pares tríada → séptima, y menos de séptima a tríada G → Cmaj7: 5 y 3. 1260 pares (43,8 %) fallan en cada sentido, por hasta 4 semitonos Confirmada para G → Cmaj7 y la proporción; refutada para el sentido: la tríada es el acorde rellenado en ambos sentidos, y una conducción de voces cuesta lo mismo leída al revés 2026-09-30, Lesson11.cs#L388-L402
¿Pasa cada uno de los diez ejemplos de consulta de la habilidad su propio patrón? Escrita de antemano: falla exactamente uno, «voice leading C major to G major» Ese, y ningún otro Confirmada 2026-09-30, Lesson11.cs#L404-L409
¿Qué da la distancia de ga_voice_leading_pair de G abierto a C abierto? Escrita de antemano: 28, cuando dejar fuera el G grave da 10 28 y 10 Confirmada 2026-09-30, Lesson11.cs#L411-L424
¿Coincide ProgressionVoiceLeadingAnalyzer con la regla de los manuales, cuerda por cuerda? Escrita de antemano: cejilla de F → cejilla de G, 3 quintas y 4 octavas; E5 → G5, 1 y 1; C abierto → G y G7 → C, una octava cada uno en las cuerdas 5 y 2; Am → Dm, ninguna Como estaba escrito, 5 de 5 Confirmada 2026-09-30, Lesson11.cs#L426-L438
¿Es exacto el atajo por desplazamientos cíclicos de VoiceLeadingSpace, y qué da sin equivalencia de octava? Escrita de antemano: ningún desacuerdo en todos los pares ordenados de conjuntos de 3 y de 4 notas, OP y OPT; sin O, C4 mayor → B3 mayor 0 y B3 mayor → C4 mayor 3 0 de 48400 y 0 de 245025, con y sin T; 0 y 3 Confirmada 2026-09-30, Lesson11.cs#L450-L471
¿Queda SetClassOpticIndex por debajo del mínimo uno a uno y cambia al intercambiar sus argumentos? Escrita de antemano: nunca por encima, por debajo y asimétrico en algunos de los 144 pares de tricordios; (012) → (048) 2, vuelta 6, uno a uno 6 0 por encima, 35 por debajo, 70 asimétricos; 2, 6 y 6 Confirmada 2026-09-30, Lesson11.cs#L473-L486
¿Cómo ordena el ga_chord_substitutions del servidor MCP los sustitutos de A menor en C mayor, y qué tonalidad usa cuando no se le da ninguna? Escrita de antemano: C y F con 2 notas comunes, luego Dm y Em con 1, frente a C ★★★, Em ★★, F ★ en la descripción; sin tonalidad, A mayor para Am y B mayor para B♭7; Bm7♭5 construido como B D F♯ A C 2, F 2, Dm 1, Em 1; A mayor y B mayor; Dm y Bdim comparten 2 notas con Bm7♭5 Confirmada, sobre una reescritura de la closure 2026-10-01, Lesson12.cs#L529-L549
¿Qué acordes reciben la línea de tritono de la closure? Escrita de antemano: G7 recibe D♭7; G9 y G13 ninguna Como estaba escrito Confirmada, sobre la reescritura 2026-10-01, Lesson12.cs#L551-L558
¿Qué camino sigue cada uno de los doce ejemplos de consultas de ChordSubstitutionSkill? Escrita de antemano: diez dan sustitutos; «Alternative chord for F major in C» compara F con C; «Borrow a chord from parallel minor» no encuentra ningún acorde Como estaba escrito Confirmada 2026-10-01, Lesson12.cs#L560-L568
¿Cuáles son los cinco sustitutos de la habilidad para un acorde? Escrita de antemano: cada acorde con el mismo vector a coste 0,60 y distancia 1, en el orden de los números de 12 bits; para G7 Dm7♭5, A♭7, F7, D7, E♭m7♭5; para Am Cm, C, A♭, D♭m, Fm; para C Cm, A♭, D♭m, Fm, D♭; para Cmaj7 D♭maj7, A♭maj7, Fmaj7, Dmaj7, Amaj7 Las cuatro listas como estaban escritas; 23, 23, 23 y 11 acordes empatados, tantos como el curso cuenta con el mismo vector Confirmada 2026-10-01, Lesson12.cs#L570-L610
¿Qué etiquetas da la habilidad a G7 → D♭7, Dm → G, C → C y B♭7 → C? Escrita de antemano: Tritone Substitution, Set-Class Equivalent e ICV Neighbor (L1 = 1); Secondary Dominant; Set-Class Equivalent e ICV Neighbor (L1 = 1); Backdoor Dominant sola Como estaba escrito; Dm → G recibe además las dos etiquetas de clase de conjuntos Confirmada 2026-10-01, Lesson12.cs#L612-L616
¿Qué devuelve get_borrowed_chords para C mayor? Escrita de antemano: 18 acordes atribuidos al primer modo que los contiene, fundamentales con sostenidos, números romanos sin alteración, listados por modo Los 18, en ese orden, con esos números romanos Confirmada 2026-10-01, Lesson12.cs#L618-L641
¿Qué parte de ModalInterchange.yaml es correcta, y lo lee algún código de GA? Escrita de antemano: 9 de los 13 acordes escritos bien, 3 de los 6 números romanos cromáticos mal; ningún código lee el archivo 9 y 4; 3 de 6; YamlKnowledgeLoader lo lee con los demás archivos YAML de contenido, y YamlKnowledgeSyncService guardaría las entradas con embeddings, aunque ningún host lo registra Confirmada para los acordes y los números romanos; refutada para los lectores 2026-10-01, Lesson12.cs#L643-L675
¿Son los ModeFormula de GA para los siete modos de la menor melódica los del curso? Escrita de antemano: 7 de 7, con la escala de GA escrita desde A 7 de 7, y las 7 grafías Confirmada 2026-10-01, Lesson13.cs#L136
¿Y para la menor armónica, doble bemol incluido? Escrita de antemano: 7 de 7; el lidio ♯2 medido contra el jónico, y la séptima del alterado ♭♭7 una séptima disminuida 7 de 7, con >♯2 y >bb7 Confirmada 2026-10-01, Lesson13.cs#L137
¿Cuántos de los 35 nombres cortos de cinco tipos de grado difieren de la tríada de su grado? Escrita de antemano: 11; 4 para la mayor, 5 para la mayor armónica, 1 para cada una de las menores armónica y melódica, ninguno para la menor natural 11, grado por grado Confirmada 2026-10-01, Lesson13.cs#L139-L155
¿Distingue StepBrightness los modos? Escrita de antemano: no; 0,2857 para los 21 modos, y 11 valores sobre los 4096 conjuntos Como estaba escrito Confirmada 2026-10-01, Lesson13.cs#L157-L184
¿Distingue IcvBrightness los modos? Escrita de antemano: no; 0,642857, 0,595238 y 0,571429, un valor por escala Como estaba escrito Confirmada 2026-10-01, Lesson13.cs#L157-L172
¿Ordena RankByBrightness los modos de una escala como la suma del curso? Escrita de antemano: sí para la mayor y la menor melódica; para la menor armónica 14 conjuntos, el lidio aumentado ♯2 primero con 41, y tres empates en el orden de los números de 12 bits Como estaba escrito Confirmada 2026-10-01, Lesson13.cs#L186-L216
¿Cuántos de los vectores que declara Modes.yaml son correctos, y cuántos miembros tienen el vector de su familia? Escrita de antemano: 31 familias, 165 modos, 9 de 18 vectores declarados mal, 60 de 134 miembros sin él; el Ultralocrian escrito como la escala alterada Como estaba escrito. GA y el curso calculan el mismo vector para las notas de 164 de los 165 modos, salvo la escala cromática Confirmada 2026-10-01, Lesson13.cs#L218-L259
¿Qué encuentran las dos búsquedas de ModesConfig? Escrita de antemano: por vector, Ionian para C mayor, nada para las menores armónica y melódica ni para Cmaj7, «Major Seventh» para G7 y Bm7♭5, «Major Triad» para C y Cm; por nombre, 8 de los 14 nombres de GA y ningún nombre alternativo Los vectores como estaba escrito. 9 nombres: «Ionian Augmented» se encuentra en la familia Double Harmonic, a través de un nombre cortado por un comentario YAML. Ningún nombre alternativo Confirmada para los vectores y los nombres alternativos; refutada para el número de nombres encontrados 2026-10-01, Lesson13.cs#L261-L295
¿Cuántos conjuntos tienen transposiciones limitadas, y los encuentra IsSymmetricSet? Escrita de antemano: 76 conjuntos en 17 clases de transposición, 15 sin el conjunto vacío y la escala cromática; las transposiciones y los modos de Messiaen como los da su lista; acuerdo en los 4096 conjuntos 76, 17 y 15, en 14 clases de conjuntos; 7 modos de 7; 4096 de 4096 Confirmada 2026-10-01, Lesson14.cs#L158-L194
¿Cuántos modos distintos contienen las tres clases de modos simétricos de GA? Escrita de antemano: 6, 8 y 6 modos para 1, 2 y 2 conjuntos sobre C, con las transposiciones correctas, 2, 3 y 4 Como estaba escrito Confirmada 2026-10-01, Lesson14.cs#L216-L218
¿Están bien puestos los nombres de las dos escalas disminuidas? Escrita de antemano: intercambiados, el grado 1 es la escala tono-semitono Intercambiados Confirmada 2026-10-01, Lesson14.cs#L220-L226
¿Es Scale.Tritone la escala de tritono? Escrita de antemano: no; 6-Z50 con 12 transposiciones y 6 modos, donde la escala de tritono es 6-30 con 6 y 3 Como estaba escrito; el IsSymmetricSet de GA responde False para la escala de GA y True para la escala de tritono Confirmada 2026-10-01, Lesson14.cs#L228-L242
¿Qué modos de Messiaen nombra IdentifyMessiaenMode? Escrita de antemano: solo los modos 1 a 3 Solo los modos 1 a 3 Confirmada 2026-10-01, Lesson14.cs#L196-L212
¿Cuántos conjuntos marca IsMonomodal, y cuántos tienen transposiciones limitadas? Escrita de antemano: 29, 17 de ellos limitados, sin la escala octatónica Como estaba escrito Confirmada 2026-10-01, Lesson14.cs#L246-L262
¿Qué llaman simétrico AtonalModalFamilies.yaml y ModesSkill, y coinciden las etiquetas de Forte del archivo con ForteCatalog? Escrita de antemano: 6 familias de 200; Forte 2-1, 3-1, 4-1 y 6-1 en la respuesta; ningún acuerdo para 2, 3, 4, 8, 9 y 10 notas, acuerdo para 1-1, 11-1 y 12-1 Como estaba escrito; una familia de hexacordios también coincide, 4 de 200 en total Confirmada 2026-10-01, Lesson14.cs#L266-L302
¿Cuántos conjuntos marca IsSymmetricalSet? Escrita de antemano: 156, 16 de ellos limitados, 60 conjuntos limitados sin marcar; C D E marcado, B♭ C D no Como estaba escrito Confirmada 2026-10-01, Lesson14.cs#L246-L263
¿Coincide IsInversionallySymmetric con los ejes especulares del curso, y tienen las clases limitadas tantos ejes como transposiciones que las fijan? Escrita de antemano: 352 clases, 96 simétricas; 13 de las 15 clases limitadas simétricas por espejo, 6, 4 y 3 ejes para las escalas de tonos enteros, octatónica y aumentada Como estaba escrito, y ningún conjunto con otro número de ejes Confirmada 2026-10-01, Lesson14.cs#L306-L330
¿Qué hacen los dos parsers de GA con 41 cifrados de acordes? Escrita de antemano: FromSymbol 14 bien, 26 acordes rechazados, CM7 una séptima menor; ChordSymbolParser 17 bien, ningún rechazo, cada lectura errónea nombrada, «Can» C mayor y «Give» G mayor Como estaba escrito Confirmada 2026-10-02, Lesson15.cs#L313-L336
¿Vuelven a leer bien los acordes extendidos las tres maneras de nombrar de GA? Escrita de antemano: TryFindExact nada para C13, Cmaj13, Cm13 y Cmaj11; GetSymbolSuffix sin el «maj» de maj9, maj11 y maj13; GenerateChordName los once; C13, Fmaj13 y Gm13 un solo conjunto Como estaba escrito Confirmada 2026-10-02, Lesson15.cs#L273-L301
¿Cómo llama ChordAlterationService a los nueve acordes alterados de GA? Escrita de antemano: C9(b9,b5,#5), C9(b9), C7, cuatro C7alt, C9(b9,b5), Cmaj7(b5); Cdim(b5), Caug(#5), Cdim7(b5), C6(b5) Como estaba escrito Confirmada 2026-10-02, Lesson15.cs#L340-L363
¿Qué alteraciones llevan las plantillas de ChordTemplateFactory? Escrita de antemano: cada plantilla dos veces; ♭13 nunca; ♯9 solo en las plantillas Sus2, ♯11 solo en las plantillas Sus4 Como estaba escrito: 80 y 176 plantillas Confirmada 2026-10-02, Lesson15.cs#L367-L382
¿Qué imprime ga_polychord, y qué modos contienen cada poliacorde? Escrita de antemano: {C, Eb, E, F#, G, B} para B sobre C; Bm/C solo en el lidio, B/C solo en el lidio ♯2; C sobre F♯ seis notas, 6-30, en ninguno de los 28 modos y en la octatónica semitono-tono; D sobre E♭ solo en el lidio ♯2; C sobre D A C D E F♯ G Como estaba escrito Confirmada 2026-10-02, Lesson15.cs#L406-L426
¿Qué devuelve YamlKnowledgeLoader de ExtendedChords.yaml y AdvancedHarmony.yaml? Escrita de antemano: 3 y 9 entradas; el acorde de 13.ª 1 3 5 ♭7 9 13; «Polychords» con doce alturas cromáticas Como estaba escrito Confirmada 2026-10-02, Lesson15.cs#L430-L449
¿Qué tríadas sobre C7 evitan F y B, y las nombra el catálogo de GA? Escrita de antemano: 6 mayores y 6 menores, las nueve estructuras superiores de Wikipedia más C, Gm y Am; ningún patrón en el catálogo Como estaba escrito; ninguno de los 62 patrones se llama upper structure ni polychord Confirmada 2026-10-02, Lesson15.cs#L386-L402
¿Cómo llama DetectDropVoicing a los 128 voicings drop de los cuatro acordes de séptima sobre C, y a los ejemplos de Wikipedia? Escrita de antemano: «Drop-2» para los 64 voicings cerrados, drop 2, drop 3 y drop 4, nada para los 64 restantes; nada para los siete ejemplos de Wikipedia Como estaba escrito Confirmada 2026-10-02, Lesson16.cs#L173-L215
¿Qué dicen IsRootless e IsOpenVoicing, y qué formas de guitarra son «Drop-2»? Escrita de antemano: 112 «rootless», ninguno abierto; los siete acordes abiertos de la lección 3 «rootless», tres de ellos «Drop-2»; x3200x «Drop-2» y no «rootless», x3545x «Drop-2» y «rootless» Como estaba escrito Confirmada 2026-10-02, Lesson16.cs#L219-L232
¿Qué voicings reconoce cada una de las tres reglas de shell de GA? Escrita de antemano: la regla de las cuerdas los seis shells, xx0232 y las dos formas de Cmaj7; el motor los tres shells en la sexta cuerda y las siete tríadas abiertas; el filtro solo los tres shells en la sexta cuerda Como estaba escrito Confirmada 2026-10-02, Lesson16.cs#L236-L252
¿Cuántos voicings devuelve VoicingGenerator, y qué hacen la etiqueta y los filtros de GA con los acordes de séptima entre ellos? Escrita de antemano: 667 125; «Drop-2» exactamente en los voicings cerrados, drop 2, drop 3 y drop 4; las 48 formas drop 2 y las 32 formas drop 3 de MUS-005 todas presentes; Drop2 los voicings cerrados y con una voz bajada, ClosedPosition todos, Rootless los de más de una octava, los demás ninguno Como estaba escrito: 687 voicings, 264 guardados por Drop2, 672 por Rootless Confirmada 2026-10-02, Lesson16.cs#L256-L333
¿Muestran las filas ii–V–I de TransposeTables los movimientos de las notas guía, y registra el análisis de GA las notas guía? Escrita de antemano: los cuatro movimientos en las doce filas, F F E y C B B en C; HasGuideTones falso y Tones, OmittedTones vacíos para cada voicing analizado Como estaba escrito, sobre 711 análisis Confirmada 2026-10-02, Lesson16.cs#L337-L369
¿Llegan las recetas de acompañamiento a la recuperación, y tocan sus digitaciones sus nombres? Escrita de antemano: las seis recetas devueltas con sus digitaciones; ninguna digitación con las notas de su nombre o de su orden de grados; el E7 de la receta de blues correcto Como estaba escrito; 36 entradas del archivo Confirmada 2026-10-02, Lesson16.cs#L373-L408
¿Dónde ponen los trastes las dos clases de geometría de GA, y son correctas las distancias que cita PHYSICAL_PLAYABILITY_IMPROVEMENTS.md? Escrita de antemano: las dos de acuerdo con el curso en cada traste, el traste 12 a 323,85 y 324,00 mm; las cinco cifras de MUS-009; tres filas DIFF, 162,55, 108,49 y 81,27 mm, la distancia de abajo un 100,0 % mayor y no un 71,4 % Como estaba escrito Confirmada 2026-10-02, Lesson17.cs#L185-L210
¿Hasta dónde llega la extensión cómoda de GA, y lee alguna medida la mano del músico? Escrita de antemano: los trastes 1 a 5 desde el traste 1, 7 a 13 desde el traste 7, 12 a 21 desde el traste 12; la primera posición en 0,1502; la mano Medium y los 129 mm del perfil por defecto, que no lee ninguno de los tres analizadores Como estaba escrito Confirmada 2026-10-02, Lesson17.cs#L214-L226, Lesson17.cs#L334-L337
¿Dónde se sitúan las cinco formas CAGED de C, y las nombra DetectCagedShape? Escrita de antemano: trastes 0, 3, 5, 8 y 10, en cada tonalidad el orden C A G E D leído en círculo desde una de sus letras; en el orden de cuerdas de GA ninguna forma nombrada, 001220 nombrado «E-Shape»; invertida, la forma de E en cada traste y nada más Como estaba escrito: la forma de E en los 13 trastes Confirmada 2026-10-02, Lesson17.cs#L230-L302
¿Qué hacen las tres medidas de coste y dificultad de GA con las formas? Escrita de antemano: ningún término de cejilla; de −0,63 (Em) a −0,06 (D), F 0,29, la forma de D en C 0,59, la forma de E en el traste 12 0,66; el C abierto «Intermediate»; F «Very Easy» (0,92) por encima del C abierto (0,82) en BiomechanicalAnalyzer; tamaños de mano y campos del perfil sin efecto; la forma de D en C con 1,04 en Beginner() y 0,18 en Jazz() Como estaba escrito Confirmada 2026-10-02, Lesson17.cs#L306-L347
¿Son las afinaciones de guitarra de Tunings.toml las de Instruments.yaml, y lee el archivo algún código de GA? Escrita de antemano: las mismas 15 entradas, con la cuerda 2 de OpenCMajor y OpenAMajor bajada 11 y 10 semitonos como en Instruments.yaml; OpenEMajorV2 un acorde de E menor; los cuatro órdenes de cuerdas de Wikipedia; ningún lector en el C# ni el F# de GA Como estaba escrito; los lectores comprobados buscando en el código, no ejecutándolo Confirmada 2026-10-02, Lesson17.cs#L351-L372
¿Son correctos los 41 voicings detrás de ga_easier_voicings, y qué ofrece la herramienta para un acorde con cejilla? Escrita de antemano: Notes correcto en los 41; un B♭ en Gsus4, un B en C5, C7 sin G; cinco HasBarre; Fmaj7 para F y F5, B7 y B5 para B y Bm, nada para B♭; Fsus2 y C/F ausentes de la tabla Como estaba escrito Confirmada 2026-10-02, Lesson17.cs#L376-L406
¿Dan las tablas de arpegios de GA, ArpeggioFor y los modos de GA el acorde de séptima y el modo de cada grado? Escrita de antemano: los catorce sufijos y símbolos; los modos e intervalos de las dos tablas y MajorScaleMode correctos; diez de las otras doce escalas, los dos modos disminuidos DIFF Como estaba escrito Confirmada 2026-10-07, Lesson18.cs#L270-L315
¿Qué devuelve ga_arpeggio_suggestions cuando la petición nombra su tonalidad? Escrita de antemano: «Amm7», «Dm7m7», «G77», «Cmaj7maj7»; el modo sacado del grado de la fundamental, así que jónico para A7 en A mayor y eólico para un acorde de A mayor en C mayor; una tonalidad «Am» leída como A mayor; B♭ en C mayor cromático Como estaba escrito; GA #626 ya había corregido upstream el sufijo y el grado Confirmada 2026-10-07, Lesson18.cs#L317-L341
¿Contiene el acorde la primera escala que ofrece ImprovisationSkill, sobre 31 símbolos en C? Escrita de antemano: salvo en siete, CM7 leído como séptima menor, Cmaj7♯5, C7♯11, C7♭13, C7+5, C7♭9 y C7♯9; 16 de 17 ejemplos de petición aceptados; F, C y G jónico sobre Am F C G; G/A leído como G y A Como estaba escrito Confirmada 2026-10-07, Lesson18.cs#L343-L368
¿Qué notas llama OutsideNotesSkill.Classify notas a evitar y tensiones sobre Cmaj7, C7, Cm7 y Cm7♭5? Escrita de antemano: las notas un semitono por encima de una nota del acorde a evitar, D♭, F y A♭ sobre Cmaj7; cinco tensiones en ninguna de las escalas de ImprovisationSkill; siete de los diez ejemplos de petición con respuesta Como estaba escrito Confirmada 2026-10-07, Lesson18.cs#L370-L395
¿Coincide Classify con GAA-003 sobre la pentatónica menor de A encima de Am7 y de A7? Escrita de antemano: acuerdo sobre Am7; sobre A7, D nota a evitar pero C tensión; las tres notas que alejan un modo notas a evitar; los objetivos C♯, F♯ y G♯ Como estaba escrito Confirmada 2026-10-07, Lesson18.cs#L404-L419
¿Qué contienen las entradas de GA sobre improvisación, y están bien la caja 1 y los modos de GAA-003? Escrita de antemano: cuatro entradas con categoría vacía, ninguna que empareje un acorde con una escala; la caja 1 A C D E G, el quinto modo de la pentatónica mayor de GA; los tres modos bien deletreados Como estaba escrito Confirmada 2026-10-07, Lesson18.cs#L421-L448

2026-09-21 — Conciliación upstream del apéndice C

Sección titulada «2026-09-21 — Conciliación upstream del apéndice C»
  • GA #711 concilió los hallazgos ejecutables del apéndice C y se fusionó como b363c3f.
  • Los defectos 1–5, 7–11 y 13–18 están corregidos con cobertura de regresión. Las entradas 6, 12 y 19 siguen siendo límites documentados de diseño o representación.
  • El curso sigue fijado en a826864 para que las 40 filas DIFF originales continúen siendo reproducibles; el apéndice ahora enlaza el resultado upstream más reciente sin reescribir esa evidencia histórica.

2026-09-18 — Correcciones upstream en GA: resolución de las anomalías

Sección titulada «2026-09-18 — Correcciones upstream en GA: resolución de las anomalías»
  • 16 de los 19 defectos resueltos upstream en GA:
    • Notas y análisis de alturas: fábricas Pitch.Flat (DFlat, FFlat, GFlat, EFlat, BFlat) corregidas; regexes ancladas y precompiladas en PitchParser; Note.Flat.TryParse corregido para que B natural se analice en B (y no B♭) con soporte Unicode ♭; separación de PitchClass.TryParseSetNotation; SimpleIntervalSize.TryParse y CompoundIntervalSize.TryParse devuelven false ante entradas erróneas sin lanzar excepciones.
    • Acordes y voicings: clasificación de cualidades y sufijos de ChordFormula mejorada (separación de dim7 de extensiones de 6ª/13ª, m7b5 y dim7 preservados); transposición con ortografía correcta en el constructor de Chord; conservación de Root y Formula originales en inversiones; exclusión de cuerdas al aire (traste 0) en Voicing.HasBarre().
    • Tonalidades: KeyTools.GetParallelKey conserva la tónica con el modo opuesto; KeyTools.GetNeighboringKeys busca por recuento de armadura; Key.GetInterval restablece el orden tónica-a-nota; Key.Major.TryParse devuelve false con entrada no válida; adición de HarmonicFunction.Subtonic; corrección del número romano iii en Cadences.yaml en mi menor.
    • El defecto 12 (empaquetado en base 12) permanece como limitación fijada para preservar el orden existente del catálogo; los defectos 6 (ModalFamily) y 19 (ClosestDiatonicKey) se mantienen documentados como compromisos de diseño / heurísticas.

2026-09-15 — Un veredicto para cada divergencia, el ukelele y el bajo, tres apéndices

Sección titulada «2026-09-15 — Un veredicto para cada divergencia, el ukelele y el bajo, tres apéndices»
  • Las 40 líneas DIFF de las lecciones 1 a 7 ya tienen un veredicto, en el apéndice C: 39 son un error de GA, una (PitchClass.Parse("A")) es una convención defendible con un fallo de precedencia debajo, y ninguna es un error del curso. Proceden de 19 defectos distintos —una sola línea equivocada en Note.Chromatic.ToAccidented explica ocho líneas ella sola— y se reparten en tres familias: copiar y pegar dentro de un bloque de miembros casi idénticos, un tipo reducido al que se le pide la información que se construyó para descartar, y un TryParse que lanza una excepción.
  • Nueve frases de las lecciones 1, 2, 3, 4, 6 y 7 presentaban una divergencia como una cuestión de gusto y ahora dan el veredicto. La peor era el «Ninguna respuesta es incorrecta» de la lección 2 a propósito de ModalFamily: un modo es una rotación, una escala tiene tantos modos como notas, y las páginas de Ian Ring responden 7 y 6 donde GA responde 14 y 24.
  • Lección 8, el ukelele y el bajo. Dos hechos que un código con forma de guitarra se equivoca: un ukelele es reentrante (su cuarta cuerda suena más aguda que la tercera), y un bajo está afinado enteramente por cuartas (no tiene el único par irregular de la guitarra). Los saltos de un ukelele son 5 4 5, los mismos que los de las cuatro cuerdas agudas de la guitarra; un ukelele barítono es esas cuatro cuerdas; un bajo son las cuatro graves, una octava más abajo.
  • Tuning.BuildPitchArray decide cuál de los dos extremos de una afinación es la cuerda 1 comparando solo la primera altura con la última. Eso funciona con cualquier afinación que suba o baje de principio a fin. Con las dos afinaciones de banjo de 5 cuerdas del propio GA, cuya corta cuerda de bordón se escribe primero y suena más aguda que la última, conserva el orden del archivo y numera las cuerdas al revés. El comentario de Str, “String 1 is the string with the highest pitch”, no puede ser cierto para ese instrumento: la cuerda 1 es D4 y la cuerda 5 es G4.
  • Fretboard.GetNote documenta su primer parámetro como “Zero-based string index (0 = lowest string)” y luego indexa Tuning[stringIndex + 1], donde la cuerda 1 es la más aguda. Lo que está mal es el comentario, no el código.
  • Apéndice A: InstrumentsConfig devuelve un solo instrumento. El programa del curso ya referencia GA.Business.Config y llama a getAllInstruments() en la misma ejecución en que lee el archivo él mismo: el archivo contiene 122 instrumentos y 280 afinaciones, el cargador devuelve 1 y 2. InstrumentsYaml espera un documento con una lista Instruments: de { Name, Tunings }; el archivo es un mapa de instrumentos, cada uno un mapa de afinaciones, sin ninguna clave Instruments en ninguna parte. Tanto la comprobación de nulo como el manejador with _ -> recurren a defaultData (), dos afinaciones de guitarra escritas a mano. Nada falla y nada se registra.
  • Siete de las 280 afinaciones no son alturas: dos entradas de pedal steel empiezan por el nombre de su afinación (C6, E9), una empieza por la palabra literal Tuning, otra es el nombre del propio instrumento, a otra le falta la octava, y las dos guitarras arpa usan | para separar las cuerdas de subgraves. El mismo desliz de tomar un nombre por una altura produjo las afinaciones de cinco alturas del ukelele, que se analizan sin protestar.
  • Apéndice B: la jerarquía OPTIC. Una digitación que sube hasta una clase de conjuntos, una equivalencia cada vez, con el tipo de GA en cada peldaño —PitchClassSet tras O, P y C, TranspositionClass tras T, SetClass tras I— y los recuentos 4096, 352 y 224 coincidiendo con los del curso. El esquema de embeddings OPTIC-K de GA parte esa misma escalera en dos: STRUCTURE (dimensiones 6-29, peso 0.45) son los “pitch-class set invariants (O+P+T+I)”, MORPHOLOGY (30-53, peso 0.25) es la “physical fretboard realization”, es decir todo lo que la escalera descarta. Los pesos y los rangos están leídos en el documento de la skill, no ejecutados: por verificar.
  • El apéndice explica además el buscador de escalas de Ian Ring como esa escalera vuelta clicable —Rotate es T, Reflect es I— y Harmonious como el mismo material visto desde el otro extremo, por tonalidad y por acorde en lugar de por número de conjunto.
  • El programa del curso crece hasta diez puntos de entrada (l1 a l10), todos en check.sh. Diagrams.Fretboard ahora recibe una afinación, así que el ukelele y el bajo tienen sus propios diagramas de mástil; los catorce archivos SVG existentes son idénticos byte a byte tras el cambio.
  • Las lecciones se pueden escuchar. Un bloque de código ```play se convierte en un reproductor: las alturas de una misma línea suenan juntas, una línea tras otra. Las muestras son una nota grabada por semitono de la guitarra de nailon de FluidR3_GM, fijada en un commit de gleitz/midi-js-soundfonts y descargada en el primer clic: nada se sintetiza, aquí no se guarda ningún archivo de audio y cada nota es una muestra reproducida a su propia altura. La afinación estándar está en la lección 1, do jonio frente a do dorio en la lección 2, los cuatro voicings en la lección 3, el ii–V–I en la lección 7 y la forma de guitarra frente a los mismos dedos en un ukelele en la lección 8. El bloque es código: es idéntico en los tres idiomas, solo la etiqueta del botón sigue a la página.

2026-09-14 — Fijar GA y compilar contra él

Sección titulada «2026-09-14 — Fijar GA y compilar contra él»
  • GA está fijado en a826864 (chore(quality): snapshot 2026-09-14), la cabeza de main ese día. El clon local de GA del autor nunca se usa ni se modifica: fetch-ga.sh hace su propio clon en code/music-theory-ga/.ga, ignorado por Git.
  • El clon no tiene blobs (--filter=blob:none) y usa un sparse checkout en modo no cono de /Directory.Build.props, GA.Core, GA.Business.Config y GA.Domain.Core: Git descarga solo el contenido de esos archivos al hacer checkout. GA.Domain.Core referencia los otros dos; GA.Business.Config es un proyecto F#, que el SDK de .NET compila sin configuración adicional.
  • En Git Bash sobre Windows, los patrones sparse que empiezan por / se reescribían como rutas de Windows (C:/Program Files/Git/Common/...) y no coincidían con nada. MSYS_NO_PATHCONV=1 lo arregla.
  • Un git grep sobre el clon sin blobs se quedó colgado: descargaba uno a uno todos los blobs del repositorio. Leer archivos sueltos con git show HEAD:<path> descarga solo esos.
  • El proyecto del curso referencia GA con un simple ProjectReference (GaTheory.csproj). Compilación local de los tres proyectos de GA más el curso: de 5 a 13 segundos tras la primera restauración.
  • Ejecución de CI 34903462624, para el push que contenía el commit 79d2198: en verde en los tres sistemas operativos, 34 s en Linux, 47 s en macOS, 67 s en Windows, clon incluido.
  • El Theory.cs del curso está escrito solo a partir de las definiciones de los libros de texto y luego se compara con GA. Fuentes: Open Music Theory (capítulos citados en cada lección), Wikipedia (MIDI tuning standard, Guitar tunings, Guitar chord, Blues scale, Interval vector, List of set classes), la escala 2741 de Ian Ring, OEIS A000029 y A000031.
  • El sitio de Open Music Theory y la OEIS responden 403 a los clientes HTTP simples; los capítulos se leyeron en un navegador.
  • Comprobado en bloque sobre los 4096 conjuntos: la forma prima de Rahn del curso es igual a la forma prima de id mínimo de GA para todos los conjuntos; 224 clases de conjuntos y 352 clases de transposición, como dice la OEIS. Los empaquetados de Forte y de Rahn difieren en 6 clases de conjuntos, y en 17 de las 352 clases de transposición, la cifra que da List of set classes (las 17 se calcularon con el mismo algoritmo fuera del programa).
  • Errores encontrados en el propio programa del curso al escribirlo: el conjunto vacío hacía fallar la clave de ordenación de la forma prima; la regla de la cejilla contaba al principio las cuerdas al aire, copiando a GA; el voicing x02010 se nombraba al principio C6/A, hasta que el nombrador probó primero el bajo como fundamental.

2026-09-14 — Diferencias en el código de GA (commit a826864)

Sección titulada «2026-09-14 — Diferencias en el código de GA (commit a826864)»

Conservadas como líneas DIFF en las salidas esperadas, para que la CI se entere cuando GA cambie. Ninguna se ha comunicado al proyecto original.

Lección 1, notas:

  • Pitch.Flat.DFlat(octave), FFlat y GFlat construyen D, G y A (Pitch.cs#L285-L295).
  • La regex de PitchParser no tiene anclas e ignora las mayúsculas: Pitch.Sharp.TryParse("Eb2") tiene éxito con B2.
  • Note.Flat.Parse("B") es B♭: el parser pasa a mayúsculas y luego lee una B final como bemol.
  • PitchClass.Parse("A") es 10 (dígito de estilo hexadecimal, a propósito), mientras que la nota A es 9.
  • SimpleIntervalSize.TryParse lanza una excepción en lugar de devolver false.
  • Fretboard.GetPositionsForNote(Note.Sharp.C) no encuentra nada: las posiciones contienen Note.Chromatic, y los records de tipos distintos nunca son iguales.
  • Menor, sin efecto visible: ValueObjectUtils.IsValueInRange(..., normalize: true) calcula count = max - min y suma 1 después del módulo, a diferencia de EnsureValueRange; con la normalización, ambos acaban siempre dentro del rango (ValueObjectUtils.cs#L69-L92).

Lección 2, escalas:

  • ModalFamily agrupa los conjuntos que contienen 0 por vector interválico, no por rotación: 14 «modos» para la menor armónica (sus propios 7 y los de la mayor armónica), 24 para el blues (con su inversión y una clase relacionada por Z). No es un error, pero el nombre sugiere rotaciones.
  • Las escalas menores están escritas desde A, así que Scale.NaturalMinor tiene el id de C mayor (2741). Es lo esperable para un conjunto de clases de altura, pero sorprende junto a las demás escalas, escritas desde C.

Lección 3, acordes:

  • ChordFormula.DetermineQuality nunca devuelve Major7, Minor7, HalfDiminished ni Diminished7, así que GetSymbolSuffix da 7 para maj7, dim7 para m7♭5 y dim6 para dim7.
  • El constructor de Chord escribe todas las notas que no son la fundamental con sostenidos: Eb → Eb G A#, Gb7 → Gb A# C# E.
  • Chord.AnalyzeChordFormula omite Notes[0] como si fuera la fundamental; tras ToInversion(1) es el bajo, la tercera se pierde y la cualidad es Other.
  • Voicing.HasBarre cuenta las cuerdas al aire: el C abierto con un E grave, el E abierto y el G abierto son acordes «con cejilla».
  • Los diagramas de voicings de GA empiezan por la cuerda 1 (E aguda), al revés que los diagramas de acordes.
  • CanonicalChordPatternCatalog lista cuatro conjuntos de intervalos dos veces (9-sus4/dominant-11, major-6-add-9/6-9, minor-6-add-9/minor-6-9, augmented-7/dominant-7-sharp-5); TryFindExact nunca puede devolver el segundo nombre de cada par.
  • En el uso que hace el curso, el catálogo empareja intervalos desde la nota más grave, así que una inversión como 032010 (C/E) no tiene nombre.

Lección 4, clases de conjuntos:

  • IntervalClassVectorId empaqueta los recuentos en base 12; los recuentos de 12 de la escala cromática desbordan y se decodifican como <1 1 1 1 0 6>.
  • CanonicalForteCatalog describe sus datos como “the standard Forte-column values”, pero almacena las grafías de Rahn para las clases en disputa (5-20 01568, 6-Z29 023679), como la tabla de Open Music Theory. Las etiquetas son correctas; solo el comentario es impreciso.
  • GrothendieckDelta.FromIcVs convierte una diferencia nula en Ic1 = 1 a propósito, así que los conjuntos con el mismo vector aparecen a distancia 1, y los «vecinos a distancia 1» de una tríada son las demás tríadas mayores y menores, ella incluida.

Llamado desde esta sesión a través del servidor MCP de GA (el servidor no indica versión; puede que no ejecute el commit a826864). Las referencias al código son de a826864.

  • ga_set_class_subs("Am") y ("G7"): las listas correctas (todas las tríadas mayores y menores; todas las séptimas de dominante y semidisminuidas), pero todos los acordes bajo [maj] (c.EndsWith("") en ChordAtonalTool.cs#L187-L190), y una descripción que dice “Am and C are NOT equivalent”.
  • ga_chord_intervals: Cm7b5 → P1 m3 P5 m7, G7b9 → P1 M3 P5 m7, C9 → P1 M3 P5 M9, Cmaj9 → P1 M3 P5 M9. El closure F# conserva un intervalo por extensión e ignora las alteraciones (DomainClosures.fs#L85-L98). ga_parse_chord("Cm7b5") sí analizó alt:b5.
  • ga_chord_to_set, que toma sus clases de altura del mismo closure: Cm7b5 → {C, Eb, G, Bb}, 4-26 (debería ser 4-27, con G♭); Cdim7 → {C, Eb, F#, Bb}, 4-27, “Scale: Major Seventh” (debería ser 4-28, con A); C → 3-11, prima 0 3 7, una familia modal de 6.
  • ga_icv_neighbors("C", 1): doce líneas idénticas <0 0 1 1 1 0> Δ=1 Forte:3-11 [Major Triad], explicadas por la regla de la diferencia nula de arriba.
  • ga_scale_by_id(2741): Major, con Forte Number: Some(n/a) (se esperaba 7-35). ga_scale_by_name("Dorian"): no encontrada.
  • get_tuning(Guitar, Standard): E2 A2 D3 G3 B3 E4, correcto. get_chord_voicings("C", maxFret 3): “An error occurred”. ga_search_voicings("C major open chord"): la restricción “open” se ignoró (diagrama 8-8-x-x-7-x, etiquetado C/E).

2026-09-14 — Notas sobre los módulos de Streeling

Sección titulada «2026-09-14 — Notas sobre los módulos de Streeling»

Los módulos se generan a partir de GuitarAlchemist/Demerzel y no se modificaron; las lecciones los enlazan donde ayudan.

  • MUS-006, “Modes as Rotations”: un desplazamiento circular a la izquierda del id transpone (C mayor desplazada 2 es D mayor, 2774); para obtener D dórico sobre C hace falta el desplazamiento opuesto (1709). La respuesta del ejercicio “rotate left by 2 semitones → 2nd mode” tiene el mismo problema de dirección.
  • MUS-006 dice que Forte “identified 224 distinct set classes for cardinalities 3 through 9”; 224 cuenta todas las cardinalidades de 0 a 12.
  • MUS-002 obtiene la forma prima de las cuerdas al aire (E A D G B) como [0,2,5,7,9], comparando clases de altura en lugar de intervalos en el desempate; la forma prima es (02479). El mismo módulo responde “are major and minor triads different set classes? Yes”, luego pone ambas en 3-11, y escribe las formas primas entre corchetes donde Open Music Theory usa paréntesis.
  • GTR-002 etiqueta la forma de C x 3 2 0 1 0 con “Strings: 5-4-3-2-1”: seis símbolos para cinco cuerdas, siendo la x la cuerda 6.
  • Los diagramas son archivos SVG que escribe el programa del curso (Diagrams.cs) en src/assets/music-theory-ga/ y que las lecciones .mdx importan como componentes, así que quedan incrustados en la página. Sus colores son currentColor y las variables CSS de Starlight (--sl-color-accent-high, --sl-color-orange-high, --sl-color-green-high, --sl-color-bg), con un valor de reserva claro, y siguen el tema claro u oscuro del sitio. Solo contienen nombres de notas y números, así que los tres idiomas comparten los mismos archivos; la descripción está en el aria-label de cada página y en el párrafo que precede a la figura.
  • check.sh los regenera en memoria y los compara con los archivos del repositorio; la CI falla cuando un diagrama no está al día. Para regenerarlos: dotnet run --project GaTheory -c Release -- svg ../../src/assets/music-theory-ga.
  • GA tiene componentes React para las mismas figuras, que el curso lee pero no reutiliza: BraceletNotation.tsx, FretDiagram.tsx y VexChordDiagram.tsx, en ReactComponents/ga-react-components/src/components. Leyendo BraceletNotation y su NoteGroup (sin ejecutarlos, por verificar en un navegador): los puntos y las etiquetas se colocan en angle − 90°, pero los radios de NoteGroup usan cos(angle) sin ese desfase, así que estarían girados un cuarto de vuelta; y findSymmetryAxes solo prueba ejes que pasan por una nota, se salta los ejes que pasan entre dos notas y añade cada eje dos veces.

2026-09-15 — Lecciones 5 a 7: diferencias en el código de GA (commit a826864)

Sección titulada «2026-09-15 — Lecciones 5 a 7: diferencias en el código de GA (commit a826864)»

Conservadas como líneas DIFF en las salidas esperadas. Ninguna se ha comunicado al proyecto original.

Lección 5, tonalidades:

  • Key.GetInterval(note) devuelve note.GetInterval(Root), el intervalo que sube desde la nota hasta la tónica: Key.Major.C.GetInterval(E) es m6, no M3 (Key.cs#L70-L76).
  • Key.Major.TryParse("H") lanza InvalidOperationException en lugar de devolver false, y Key.Minor.TryParse tiene el mismo código (Key.cs#L153-L186).
  • Las herramientas MCP get_parallel_key y get_relative_key tienen el mismo cuerpo: el otro modo sobre la misma armadura, así que la tonalidad homónima de C es A menor (KeyTools.cs#L135-L169).
  • get_neighboring_keys pasa key.KeySignature.ToString(), la lista de alteraciones, a una búsqueda por nombre de tonalidad, y falla (KeyTools.cs#L197-L215).

Lección 6, acordes de una tonalidad:

  • HarmonicFunctionExtensions.FromDegree(7) es siempre LeadingTone, también para la subtónica de la menor natural; ScaleDegreeFunction.Subtonic existe pero no se usa ahí.
  • ga_diatonic_chords nombra las fundamentales con una tabla de 12 nombres: F♯ mayor recibe Fdim (E♯dim) y G♭ mayor recibe B (C♭) (DomainClosures.fs#L23-L36). El Key.Notes del núcleo escribe bien las dos tonalidades.
  • Solo lectura del código (el curso no compila GA.Domain.Services, por verificar): HarmonicFunctionAnalyzer.Parse prueba Contains("tonic") antes que "supertonic" y "mediant" antes que "submediant", así que “Supertonic” se analizaría como Tonic y “Submediant” como Mediant (HarmonicFunctionAnalyzer.cs#L29-L72). ToPrimaryCategory agrupa la mediante y la submediante con la tónica, donde Open Music Theory llama a iii y vi predominantes débiles: una elección de manual, no un error.

Lección 7, cadencias y progresiones:

  • Cadences.yaml numera “Chromatic Mediant (Metal)”, Em–Gm en E menor, como i biii, desde E mayor; la cadencia andaluza del mismo archivo se numera a partir de las notas de E frigio. Su “Phrygian Half Cadence” es ♭II–i, cuando el término clásico designa iv⁶–V en menor.
  • PitchClassSet.ClosestDiatonicKey resuelve los empates con «la forma normal contiene la clase de altura 3, luego menor». La forma normal de las notas de una escala mayor es 0 1 3 5 6 8 T, así que C F G C, G D Em C, Dm7 G7 Cmaj7 y C Am F G7 salen en la relativa menor (PitchClassSet.cs#L597-L660).
  • ga_key_from_progression y ga_analyze_progression puntúan las tonalidades solo por las fundamentales de los acordes, contra la escala menor natural, y prefieren la fundamental del primer acorde (GuitaristProblemTools.cs#L157-L223, DomainClosures.fs#L255-L336).

2026-09-15 — El servidor MCP de GA, tonalidades y progresiones

Sección titulada «2026-09-15 — El servidor MCP de GA, tonalidades y progresiones»

La misma salvedad que el 2026-09-14: el servidor no indica su versión.

  • get_parallel_key("Key of C") → Key of Am. get_relative_key("Key of Ab") → Key of Fm, correcto. get_key_signature_info("Key of Gm") → tónica G, Bb Eb, notas G A Bb C D Eb F, correcto.
  • get_neighboring_keys("Key of C") y get_diatonic_chords("A minor"): “An error occurred invoking …”.
  • ga_diatonic_chords: F♯ mayor → F#, G#m, A#m, B, C#, D#m, Fdim; G♭ mayor → Gb, Abm, Bbm, B, Db, Ebm, Fdim.
  • ga_key_from_progression(["Am","F","C","G"]) → mejor opción A menor (luego C mayor y D menor, todas 4/4), mientras que la descripción de la herramienta promete C mayor; (["Dm7","G7","Cmaj7"]) → D menor (luego C mayor y C menor).
  • ga_analyze_progression("Am Dm E7 Am") → “Key: A major, I IV V I”; ("Dm7 G7 Cmaj7") → “Key: D minor, i iv VII”.

2026-09-15 — Notas sobre los módulos de Streeling (continuación)

Sección titulada «2026-09-15 — Notas sobre los módulos de Streeling (continuación)»
  • MUS-003, “Guitar Example — D7 to G Voice Movements”: la tablatura pone C en el traste 1 de la cuerda E aguda y F♯ en el traste 1 de la cuerda B. El traste 1 es F en la cuerda E aguda y C en la cuerda B; el D7 abierto (xx0212) tiene F♯ en el traste 2 de la cuerda 1 y C en el traste 1 de la cuerda 2. Las lecciones enlazan MUS-003 por sus funciones, sus cadencias y sus tonalidades estrechamente relacionadas, no por este ejemplo.
  • MUS-003 pone iii y vi en la familia de la tónica; la lección 6 da las dos lecturas.

2026-10-02 — Las notas sobre Streeling, corregidas upstream

Sección titulada «2026-10-02 — Las notas sobre Streeling, corregidas upstream»
  • Demerzel #1091, fusionada como e203e5a, corrigió los puntos de MUS-006, MUS-002 y GTR-002 de las notas del 2026-09-14; Demerzel #1098, fusionada como 98625c3, corrigió la tablatura de MUS-003 de las notas del 2026-09-15. Learn #114 sincroniza ambas aquí. En e203e5a:
    • MUS-006 describe un modo como un desplazamiento circular a la derecha y advierte que un desplazamiento a la izquierda transpone (líneas 146-148); sus respuestas del ejercicio rotan a la derecha (líneas 194-195); cuenta 208 clases de Forte de 3 a 9 notas y 224 en total (línea 223).
    • MUS-002 da (02479) como forma prima de las cuerdas al aire (línea 136), escribe las formas primas entre paréntesis (línea 105) y responde a la pregunta de las tríadas para cada equivalencia (línea 107).
    • GTR-002 lee sus diagramas de la cuerda 6 a la cuerda 1 (líneas 29-33).
    • El D7 de MUS-003 pone F♯ en el traste 2 de la cuerda 1 y C en el traste 1 de la cuerda 2 (líneas 196-197).
  • La lección 2 citaba la regla antigua de MUS-006 en presente; ahora la cita en pasado, fijada en Demerzel fbfb2ee, el último commit antes de #1091.

2026-09-24 — Correcciones upstream comprobadas de nuevo

Sección titulada «2026-09-24 — Correcciones upstream comprobadas de nuevo»
  • GA fusionó correcciones para las filas de la tabla QA: #681 para las herramientas MCP y #682 para los analizadores el 2026-09-23, #625 para la detección de tonalidad el 2026-09-24. El curso sigue fijado a a826864, así que las lecciones y los apéndices siguen mostrando el comportamiento contra el que se escribieron.
  • recheck/probe.cs llama directamente a los mismos métodos de herramientas, sin el transporte MCP, sobre GA 52f7fd5; su salida es recheck/results.txt. Solo imprime los hechos de los que trata cada hallazgo, y ga-recheck.yml lo ejecuta cada lunes contra la rama main de GA y falla ante cualquier diferencia con results.txt: un hallazgo que vuelve, o una corrección que cambia una respuesta, se ve ahí. No forma parte de check.sh, porque necesita un clon completo de GA.
  • Corregido, y relanzado: ga_chord_to_set('Cm7b5') → {C, Eb, F#, Bb}, 4-27, y ('Cdim7') → 0 3 6 9, 4-28 (escrito {C, Eb, F#, A}). ga_set_class_subs('Am') → las tríadas mayores bajo [maj], las menores bajo [m]. ga_icv_neighbors('C', 1) → «No other set class within distance 1 of C» en lugar de doce líneas idénticas. ga_scale_by_id(2741) → Forte Number: 7-35, y ga_scale_by_name('Dorian') → id 1709. get_neighboring_keys('Key of C') → F, C, G.
  • La detección de tonalidad pasa ahora por KeyIdentificationService, que suma un peso de cadencia al número de acordes diatónicos (líneas 171-237). ga_analyze_progression("Dm7 G7 Cmaj7") → «Key: C major», ii V I, y ga_key_from_progression coincide; ga_analyze_progression("Am Dm E7 Am") → «Key: A minor», i iv v i.
  • #729, fusionada el 2026-09-24, corrige lo que esa nueva ejecución aún daba mal. En menor, la dominante mayor pertenece ahora a la tonalidad: "Am Dm E7 Am" → i iv V i, confianza 4/4 en lugar de 3/4. El numeral sigue la calidad del acorde (Bm7b5 → viiø, Bdim → vii°). Un empate entre tonalidades relativas, que comparten sus acordes, se lo lleva la tonalidad cuya tríada de tónica abre la progresión, y ya no la primera en orden alfabético: [Am, F, C, G] → A menor, [C, G, Am, F] → C mayor, y ga_analyze_progression y ga_key_from_progression dan ahora la misma tonalidad. Relanzado sobre 52f7fd5: líneas 12-19 de results.txt.
  • Todavía mal, no reportado: E7 se cifra v, porque el número sale del grado de la escala menor natural y no del acorde (romanFor); además cuenta fuera de A menor (3/4), por diseño en #625, que acredita el V7 de la escala menor armónica a través de la cadencia. ga_key_from_progression(["Am","F","C","G"]) sigue poniendo A menor primero, empatada 4/4 con C mayor, y la descripción de la herramienta sigue prometiendo C mayor (línea 168).
  • No relanzados: get_chord_voicings, get_diatonic_chords("A minor") y ga_search_voicings, que necesitan GaApi.
  • La fila BraceletNotation era una lectura de código; #733, fusionada el 2026-09-24, la reprodujo y la corrigió. Su prueba compara las coordenadas SVG. Con el código antiguo fallan 3 de sus 4 casos: el radio de C termina en x=160 mientras su punto está en x=100; una séptima disminuida da las direcciones de ejes [0, 0, 90] en lugar de [0, 45, 90, 135]; la escala mayor traza dos veces su único eje. Los radios usan ahora el mismo angleToCoordinates que los puntos, y los ejes se buscan por medios pasos, así que se encuentran los que caen entre dos notas. El renderizado en un navegador sigue por verificar.
  • #734, fusionada el 2026-09-24, corrige las dos filas fuera de los diecinueve defectos, cada una con una prueba que falla con el código antiguo. getAllInstruments() devuelve 122 instrumentos y 280 afinaciones donde devolvía 1 y 2. Nueve afinaciones mal formadas se restauraron a partir de Tunings.txt, el archivo del que viene el YAML: las dos entradas de pedal steel, el saz, la huapanguera, el dulcimer y las cuatro afinaciones de ukelele que empezaban por C6 o D6. Las afinaciones de banjo de 5 cuerdas numeran ahora la cuerda 1 desde el lado agudo; las que suben o bajan de un extremo a otro se numeran como antes. Los nombres de instrumentos y afinaciones son ahora las claves del YAML, DropD en lugar de Drop D.
  • Una lectura del apéndice B era errónea. Dulcimer.LydianMode es Bb C4 C4 F3 Bb2, y tomé el primer Bb por una altura sin octava. Tunings.txt dice Ducimer - Lydian Mode Bb C4 C4 F3 Bb2: el Bb es el final del nombre de la afinación, Lydian Mode Bb, que la conversión a YAML dejó en la lista de alturas. El apéndice y la fila QA ahora lo dicen.

2026-09-30 — Lección 9: predicciones antes de la primera ejecución

Sección titulada «2026-09-30 — Lección 9: predicciones antes de la primera ejecución»

Escritas a partir del código de GA en a826864, antes de que existiera el programa de la lección; la entrada de resultados contrasta cada una con lo que imprimió el programa. La herramienta MCP ga_common_tones se llamó antes de escribir esta entrada, así que sus respuestas se presentan allí como observaciones, no como pruebas.

  1. Notas comunes. El núcleo de GA, Chord.FromSymbol y luego PitchClassSet.Intersect, coincide con el curso en los 13 pares de acordes de la lección, Cmaj9, Cdim7 y C6 incluidos.
  2. La conducción de voces más pequeña del chatbot. VoiceLeadingSkill iguala el tamaño de los dos acordes repitiendo la fundamental del más pequeño (VoiceLeadingSkill.cs, líneas 185-194). Para G → Cmaj7 debería responder 5 semitonos cuando existen 3, con B duplicado: G–G, B–B, B–C, D–E. Sobre todos los pares ordenados entre las 48 tríadas (mayores, menores, disminuidas, aumentadas) y los 60 acordes de séptima (maj7, 7, m7, m7♭5, dim7), repetir la fundamental debería no alcanzar el mínimo en más del 10 % de los pares tríada → séptima, y con menos frecuencia de la séptima a la tríada.
  3. El patrón de acordes del chatbot. De los diez ejemplos de consulta de la habilidad, exactamente uno debería fallar con su propia expresión regular: «voice leading C major to G major», porque el patrón quiere un cifrado de acorde justo antes de «to».
  4. ga_voice_leading_pair con voicings de distinto tamaño. La herramienta MCP empareja las notas más graves de los dos voicings y cobra 3 semitonos por cada nota sobrante (CompositionTools.cs, líneas 320-336). De sol abierto (320003) a do abierto (x32010) debería dar 28, cuando dejar fuera el sol grave da 10.
  5. Quintas y octavas paralelas. ProgressionVoiceLeadingAnalyzer aplica la regla de los manuales cuerda por cuerda, y el curso debería coincidir en cada ejemplo: cejilla de F → cejilla de G, 3 quintas y 4 octavas; E5 → G5, 1 y 1; do abierto → sol abierto y G7 abierto → do abierto, una octava cada uno, en las cuerdas 5 y 2; Am → Dm, ninguna.
  6. VoiceLeadingSpace. Con las equivalencias de octava y de permutación, su atajo (los desplazamientos cíclicos de los dos acordes ordenados, líneas 63-91) debería igualar el mínimo por fuerza bruta sobre todas las asignaciones de voces, para cada par ordenado de conjuntos de clases de altura de 3 y de 4 notas, con y sin transposición: ningún desacuerdo. Con transposición pero sin equivalencia de octava, solo prueba desplazamientos hacia arriba de 0 a 11 semitonos (líneas 46-61): de C4 E4 G4 a B3 D♯4 F♯4 debería dar 0, ya que B3 desplazado un semitono hacia arriba es C4, y de B3 D♯4 F♯4 a C4 E4 G4 debería dar 3.
  7. SetClassOpticIndex. Para dos clases de conjuntos del mismo tamaño, suma, para cada nota de la primera, la distancia a la nota más cercana de la segunda (líneas 167-224), así que varias voces pueden ir a parar a una misma nota. Eso nunca puede superar el mínimo uno a uno, y debería quedar por debajo de él, y diferir de sí mismo al intercambiar los argumentos, en algunos de los 144 pares ordenados de las 12 clases de tricordios: (012) frente a (048) debería dar 2 en un sentido y 6 en el otro, cuando uno a uno da 6.

2026-09-30 — Lección 9: resultados frente a las predicciones

Sección titulada «2026-09-30 — Lección 9: resultados frente a las predicciones»

El programa es Lesson11.cs (punto de entrada l11, después de los dos apéndices), su salida expected/l11.txt; check.sh pasa para las lecciones 1 a 11 y los 18 diagramas. Compila tal cual cuatro archivos de GA.Domain.Services (VoiceLeadingSpace, SetClassOpticIndex, ProgressionVoiceLeadingAnalyzer y su informe), que fetch-ga.sh añade ahora a su extracción parcial, y copia tal cual el patrón de la habilidad del chatbot y la distancia de la herramienta MCP. La regla de duplicación de la habilidad está reescrita: para ella, el curso prueba su lectura del código de GA, no el chatbot en marcha.

  1. Confirmada: 13 de 13.
  2. Confirmada para G → Cmaj7, 5 semitonos cuando el curso encuentra 3 con B duplicada, y para la proporción: 1260 de los 2880 pares tríada → séptima (43,8 %) quedan por encima del mínimo, por hasta 4 semitonos, y Cdim → Gmaj7 es el primero con esa diferencia. Refutada para el sentido: séptima → tríada falla exactamente igual de a menudo, 1260 veces. Esperaba que el sentido importara, porque la fundamental repetida pertenece al primer acorde en un sentido y al segundo en el otro. Pero la habilidad siempre rellena la tríada, y una conducción de voces leída al revés cuesta lo mismo: los dos sentidos son los mismos 2880 problemas.
  3. Confirmada: «voice leading C major to G major» es el único ejemplo sin coincidencia.
  4. Confirmada: 28 y 10. Otras dos filas tienen la misma causa: G7 abierto → C abierto, 28 cuando existe 8, y xx2010 → x32010, el mismo acorde con un bajo añadido, 19 cuando existe 3.
  5. Confirmada: 5 cambios de 5, par de cuerdas por par de cuerdas.
  6. Confirmada: ningún desacuerdo en 48400 pares ordenados de conjuntos de 3 notas y 245025 de 4 notas, con y sin transposición. Sin equivalencia de octava, 0 y 3 como estaba escrito; C4 mayor → C5 mayor da además 36 y la inversa 3, cuando una distancia salvo transposición da 0.
  7. Confirmada: 2 en un sentido y 6 en el otro, uno a uno 6. En los 144 pares ordenados: 35 por debajo del mínimo uno a uno, ninguno por encima, 70 que cambian al intercambiarlos.

Observaciones, no pruebas, del servidor MCP que se ejecutaba en esta máquina el 2026-09-30 (no indica su versión):

  • ga_common_tones pierde una nota en cinco pares de siete: F en Bm7b5/G7, B en Cmaj9/Em7, A en Cdim7/F7 y en C6/Am7, B♭ en C9/Gm7. La causa es la tabla de seis extensiones que también rompía ga_chord_to_set (DomainClosures.fs, líneas 85-98 en a826864). En la rama main de GA (5c3a52a), domain.commonTones toma sus notas de chordTones, que #681 introdujo en su commit 82bc7ee6; leído, no ejecutado.
  • ga_parse_chord("Bm7b5") conserva la alteración ("components":["ext:7","alt:b5"]): las notas se pierden después del análisis.
  • ga_voice_leading_pair("G7", "C", limit 3, guitar) evaluó 225 pares y puso primero dos voicings G7/B reducidos (shells) a distancia 5, y luego uno a 6. Sus notas de más están arriba, donde emparejar desde abajo es correcto, y la función copiada da el mismo 5 para el primer par.

2026-10-01 — Lección 10: predicciones antes de la primera ejecución

Sección titulada «2026-10-01 — Lección 10: predicciones antes de la primera ejecución»

Escritas a partir del código de GA en a826864, antes de que existiera el programa de la lección; la entrada de resultados contrasta cada una con lo que imprimió el programa. Para esta lección no se llamó a ninguna herramienta MCP ni a ningún chatbot.

  1. El ga_chord_substitutions del servidor MCP. Llama a la closure F# domain.chordSubstitutions (DomainClosures.fs, líneas 535-621), que conserva las tríadas diatónicas de la tonalidad que comparten una nota con el acorde y las ordena por número de notas compartidas, los empates en el orden de la escala. Para Am en C mayor debería poner primero C y F con 2 notas compartidas, luego Dm y Em con 1, así que el ejemplo de la propia descripción de la herramienta, «C (★★★, relative major), Em (★★, shared E/B), F (★, shared A)» (GaDslTool.cs, línea 212), falla en los tres acordes. Sin tonalidad, la tonalidad es la letra del acorde, en mayor: Am se compara con los acordes de A mayor, y B♭7 con los de B mayor. En a826864, Bm7♭5 en C mayor se construye como B D F♯ A, así que Dm y Bdim comparten con él 2 notas en lugar de 3.
  2. Su línea de sustitución por tritono. Se añade cuando el acorde tiene una tercera mayor y una séptima menor sobre su fundamental (líneas 603-609): G7 recibe D♭7; G9 y G13 no reciben ninguna, porque en a826864 «9» y «13» solo añaden su propio grado.
  3. El ChordSubstitutionSkill del chatbot: qué camino toma cada ejemplo. El chatbot elige la habilidad por el significado; la habilidad lee después los cifrados de acordes con su propio patrón (ChordSubstitutionSkill.cs, líneas 69-71) y compara los acordes cuando encuentra dos (líneas 147-155). De sus doce ejemplos de consulta, diez deberían tomar el camino de un acorde; «Alternative chord for F major in C» debería comparar F con C en lugar de listar alternativas; «Borrow a chord from parallel minor» no debería encontrar ningún cifrado de acorde.
  4. La lista de un acorde de la habilidad. Conserva los conjuntos del mismo tamaño a una distancia de ICV de 3 como máximo y los ordena por coste (líneas 168-174). GrothendieckDelta.FromIcVs convierte una diferencia nula en 1 (GrothendieckDelta.cs, líneas 125-131), y dos conjuntos del mismo tamaño solo pueden estar a una distancia par, así que cada acorde con el mismo vector interválico, aquí los acordes de la misma clase de conjuntos, debería salir con coste 0,60 y distancia 1, por delante de todo lo demás, en el orden de sus números de 12 bits. Para G7: Dm7♭5, A♭7, F7, D7, E♭m7♭5, sin D♭7; para Am: Cm, C, A♭, D♭m, Fm, sin E7; para C: Cm, A♭, D♭m, Fm, D♭, sin B♭7; para Cmaj7: D♭maj7, A♭maj7, Fmaj7, Dmaj7, Amaj7.
  5. Las etiquetas de dos acordes de la habilidad. G7 → D♭7 debería recibir «Tritone Substitution», «Set-Class Equivalent» e «ICV Neighbor (L1 = 1)»; Dm → G «Secondary Dominant», porque la prueba solo mira las fundamentales (línea 262); C → C «Set-Class Equivalent» e «ICV Neighbor (L1 = 1)»; B♭7 → C solo «Backdoor Dominant».
  6. get_borrowed_chords. La herramienta MCP reenvía a ContextualChordService.GetBorrowedChordsAsync de GaApi (líneas 75-119), que el programa compila tal cual. Para C mayor debería listar 18 acordes, cada uno atribuido al primer modo paralelo que lo contiene, en el orden dórico, frigio, lidio, mixolidio, eólico, locrio: dórico Cm, D♯, Gm, A°, A♯; frigio C♯, Fm, G°, G♯, A♯m; lidio D, F♯°, Bm; mixolidio E°; eólico D°; locrio C°, D♯m, F♯. Las fundamentales de tecla negra se escriben con sostenidos (línea 137) y los números romanos no llevan ninguna alteración (líneas 157-170): G♯, el acorde de A♭, es «VI», A♯ «VII», D♯ «III», F♯, el acorde de G♭, «V», y tanto C♯ como D son «II».
  7. ModalInterchange.yaml. De los 13 acordes prestados que escribe en C mayor o en A menor, 9 deberían ser correctos y 4 erróneos: VI F mayor, VII G mayor y III C mayor son acordes propios de A menor, no acordes prestados de A mayor, y «bii°, Bb diminished» no está en A frigio, cuyo segundo grado es B♭ mayor. De los seis números romanos de sus ejemplos de menor armónica y melódica, tres deberían ser erróneos: ♭VI+ (el acorde aumentado de la menor armónica es ♭III+), iv+ (el cuarto grado de la menor melódica es un acorde mayor, y su acorde aumentado también es ♭III+) y el vii°7 de la menor melódica, que es semidisminuido. Ningún código de GA debería leer el archivo: se copia al directorio de salida y se vigila, y un cambio solo escribe «Unknown configuration file» en el registro.

2026-10-01 — Lección 10: resultados frente a las predicciones

Sección titulada «2026-10-01 — Lección 10: resultados frente a las predicciones»

El programa es Lesson12.cs (punto de entrada l12), su salida expected/l12.txt; check.sh pasa para las lecciones 1 a 12 y los 18 diagramas. Compila tal cual otros siete archivos de GA, que fetch-ga.sh añade ahora a su extracción parcial: GrothendieckDelta, GrothendieckService y su interfaz, ChordTemplateFactory y los usings globales de GA.Domain.Services, y el ContextualChordService de GaApi con sus modelos. Copia tal cual el patrón, las tablas, la selección y las etiquetas de ChordSubstitutionSkill. La closure MCP domain.chordSubstitutions es de F#, en un proyecto que el programa no compila, así que está reescrita: para las predicciones 1 y 2, el curso prueba su lectura del código de GA, no el servidor en marcha. La prueba de YamlKnowledgeLoader, que el programa ya compilaba con GA.Business.Config, no estaba en la primera ejecución: la añadí después, en su propio commit, aab1f4f, una vez encontrado el cargador.

  1. Confirmada, sobre la reescritura: C 2, F 2, Dm 1, Em 1 para Am en C mayor, así que el ejemplo de la descripción está mal en los tres acordes; Em solo comparte E con Am. Sin tonalidad, A mayor para Am y B mayor para B♭7, y otros dos del mismo tipo: F♯m frente a F mayor, E♭ frente a E mayor. Con B D F♯ A, Bm7♭5 obtiene Dm 2, G 2, Bdim 2, donde el curso, con B D F A, pone primero Dm con 3.
  2. Confirmada, sobre la reescritura: G7, D7, E7 y C7 reciben D♭7, A♭7, B♭7 y G♭7; G9 y G13 no reciben ninguno, ni Gm7 y Cmaj7, con razón.
  3. Confirmada: diez consultas dan sustitutos, «Alternative chord for F major in C» compara F con C, y «Borrow a chord from parallel minor» recibe «Could not identify a chord symbol in your message.»
  4. Confirmada: las cuatro listas como estaban escritas, cada acorde a coste 0,60 y «Δ L1=1». Empatan 23 acordes para G7, Am y C, y 11 para Cmaj7: exactamente los demás acordes de cada clase de conjuntos. D♭7 es el número 19 de los 155 acordes listados para G7; para Am, el C de los manuales es el número 2 y F el número 8 de 95. Dm7, que no había predicho, da Fm7, F♯m7, Am7, E♭m7, Cm7; su sustituto de los manuales, Fmaj7, está a 4, más allá del umbral de 3, igual que Em7 y Am7 respecto a Cmaj7. Sobre las doce fundamentales de cada tipo de acorde, las listas contienen como mucho 6 acordes distintos, y Dm7♭5 sale primero para las 12 séptimas de dominante.
  5. Confirmada para los cuatro pares. Dm → G recibe además «Set-Class Equivalent» e «ICV Neighbor (L1 = 1)», que no había anotado. Dos pares que no había predicho muestran las mismas dos pruebas: F♯ → Bdim es una «Secondary Dominant», y C → Am un «ICV Neighbor (L1 = 1)» donde la distancia es 0. G7 → C, D7 → G y B♭7 → C coinciden con el curso.
  6. Confirmada: los 18 acordes en el orden predicho, con los modos y los números romanos predichos. Un detalle que no había anotado: las notas se escriben con sostenidos aunque el nombre del acorde no los tenga: C menor es C D♯ G, A disminuido A C D♯.
  7. Confirmada para los acordes y los números romanos: 9 de 13 bien, los 4 predichos mal; ♭VI+, iv+ y el vii°7 de la menor melódica mal, los otros tres bien. Refutada para los lectores. YamlKnowledgeLoader lista todos los archivos *.yaml del directorio de configuración, salvo cinco que tienen su propio cargador, y aplana cada entrada en texto; YamlKnowledgeSyncService guardaría esos textos en la colección yaml_knowledge con embeddings, «for semantic retrieval by the chatbot agents», pero ningún host lo registra: AddSyncServices, que lo haría, nunca se llama, GaCLI tiene la llamada comentada con un TODO, y nada más lee la colección. La prueba del programa devuelve las 8 entradas del archivo, y las cuatro cadenas incorrectas están en su texto. Había buscado el nombre del archivo en GA, lo que encuentra el vigilante y la copia del build, pero no puede encontrar un lector que liste un directorio.

Observaciones, no pruebas:

  • De paso, el cargador se salta SpecializedTunings.yaml con «While parsing a flow sequence, did not find expected ‘,’ or ‘]’.» en la salida de error, y nada más. El archivo en sí no se examinó.
  • MUS-003, que la lección cita, tiene un error en su tabla de dominantes secundarias en G mayor: V7/IV es G7, G B D F, cuyo F está fuera de la tonalidad, y no D7, que es el propio V7. Su nota según la cual V7/IV se parece a V7 debería decir que V/IV, la tríada de G, se parece a I. Hay que corregirlo en Demerzel, donde se escribe el módulo.
  • La página de la misión decía que el clon parcial de GA y la salida de compilación necesitan menos de 20 MB. Medido el 2026-10-01: 35,2 MB, el clon 17,5 MB y la salida de compilación 17,7 MB. La salida de compilación son sobre todo las bibliotecas de las que dependen los proyectos de GA (las versiones nativas de PCRE.NET para tres sistemas, FSharp.Core, MathNet.Numerics) y 2,2 MB de archivos de configuración de GA. La página dice ahora unos 35 MB.
  • La entrada de la lección 9 decía que check.sh comprueba 19 diagramas. Comprueba 18: su decimonovena línea ok es la línea de resumen del comando svg. Corregido allí.

2026-10-01 — Lección 11: predicciones antes de la primera ejecución

Sección titulada «2026-10-01 — Lección 11: predicciones antes de la primera ejecución»

Escritas a partir del código de GA en a826864, antes de que existiera el programa de la lección; la entrada de resultados contrasta cada una con lo que imprimió el programa. Para esta lección no se llamó a ninguna herramienta MCP ni a ningún chatbot.

  1. Los modos de la menor melódica. MelodicMinorMode rota las notas de Scale.MelodicMinor, que GA escribe desde A (A B C D E F♯ G♯, Scale.cs, línea 120), así que sus siete modos empiezan en A, B, C, D, E, F♯ y G♯. Cada ModeFormula debería ser igual a la fórmula que el curso calcula a partir de los pasos 2 1 2 2 2 2 1, respecto a la referencia de la lección 2 (eólico cuando la tercera es menor, jónico si no): menor melódica 1 2 b3 4 5 >♮6 >♮7, dórico ♭2 1 >b2 b3 4 5 >♮6 b7, lidio aumentado 1 2 3 >♯4 >♯5 6 7, lidio dominante 1 2 3 >♯4 5 6 >b7, mixolidio ♭6 1 2 3 4 5 >b6 >b7, locrio ♮2 1 2 b3 4 >b5 b6 b7, alterada 1 >b2 b3 >b4 >b5 b6 b7: 7 de 7.
  2. Los modos de la menor armónica. Lo mismo para HarmonicMinorMode, a partir de A B C D E F G♯ (línea 119) y de los pasos 2 1 2 2 1 3 1: menor armónica 1 2 b3 4 5 b6 >♮7, locrio ♮6 1 >b2 b3 4 >b5 >♮6 b7, jónico ♯5 1 2 3 4 >♯5 6 7, dórico ♯4 1 2 b3 >♯4 5 >♮6 b7, frigio dominante 1 >b2 3 4 5 >b6 >b7, lidio ♯2 1 >♯2 3 >♯4 5 6 7, alterada 𝄫7 1 >b2 b3 >b4 >b5 b6 >bb7: 7 de 7. El lidio ♯2 se mide frente al jónico, porque una segunda aumentada no es una tercera menor, y la séptima de la alterada 𝄫7, de G♯ a F, es una séptima disminuida.
  3. Los nombres cortos. Los cinco tipos de grados implementan el mismo método IScaleDegreeNaming.ToShortName de tres maneras: números romanos sin calidad para la mayor y la mayor armónica, la tríada de cada grado para las tres escalas menores, salvo iv#4 para la menor armónica e IV7 para la menor melódica. Frente a la tríada de cada grado, 11 de los 35 deberían diferir: 4 para la mayor, 5 para la mayor armónica, 1 para la menor armónica y 1 para la menor melódica, ninguno para la menor natural. Ningún código de GA llama a ToShortName.
  4. PitchClassSet.StepBrightness. Promedia los pasos entre notas consecutivas y divide el promedio por 6 (PitchClassSet.cs, líneas 265-283). Los pasos de un conjunto de dos notas o más suman 12, así que el valor es 2/n para n notas: 0,2857 para cada uno de los 21 modos de la mayor, la menor melódica y la menor armónica. Sobre los 4096 conjuntos debería tomar 11 valores, ya que los conjuntos de 0, 1 y 4 notas dan todos 0,5.
  5. IcvBrightness. El brillo de los embeddings del chatbot (TheoryVectorService.cs, líneas 163-172) solo lee el vector interválico, que comparten todos los modos de una escala: 0,642857 para los siete modos de la mayor, 0,595238 para la menor melódica, 0,571429 para la menor armónica. Según esta medida, el lidio y el locrio son igual de brillantes.
  6. UnifiedModeService.RankByBrightness. Suma las clases de altura de cada miembro de la ModalFamily del conjunto (UnifiedModeService.cs, líneas 228-242). Todos los miembros contienen C, así que la suma es el brillo del curso para el modo sobre C: los semitonos de sus siete grados sobre la tónica, sumados. Para la mayor debería dar el orden del curso, del lidio con 39 al locrio con 33. Para la menor melódica también: lidio aumentado 40, lidio dominante 38, menor melódica 37, mixolidio ♭6 36, dórico ♭2 35, locrio ♮2 34, alterada 32. Para la menor armónica debería clasificar 14 conjuntos, porque la familia contiene también los siete modos de la mayor armónica (lección 2). Primero va el lidio aumentado ♯2 de la mayor armónica, con 41, por delante del lidio ♯2 con 40. Tres empates, en 37, 36 y 35, juntan cada uno un modo de la menor armónica con uno de la mayor armónica, en el orden de sus números de 12 bits: dórico ♯4 antes que mayor armónica, mixolidio ♭2 antes que menor armónica, frigio dominante antes que dórico ♭5.
  7. Modes.yaml. El archivo que leen las herramientas de modos del servidor MCP y el ModesSkill del chatbot contiene 31 familias y 165 modos. 18 familias declaran un vector interválico. Para 9 de ellas no es el vector que el PitchClassSet de GA calcula a partir de las notas del primer modo de la familia: menor armónica, menor melódica, pentatónica mayor, escala de tonos enteros, disminuida, blues, cromática, tríada aumentada y acorde de séptima mayor. De los otros 134 modos, 60 no tienen el vector del primer modo de su familia. Entre ellos está el ultralocrio de la familia de la menor armónica, escrito C D♭ E♭ F♭ G♭ A♭ B♭ como la escala alterada, cuando su séptima es B𝄫.
  8. Las búsquedas de ModesConfig. TryGetModeByIntervalClassVector da la línea «Scale:» de ga_chord_to_set (ChordAtonalTool.cs, línea 112). Con los vectores que calcula GA, C mayor debería encontrar Ionian; la menor armónica, la menor melódica y Cmaj7, nada; G7 y Bm7♭5, ambos 4-27, «Major Seventh»; C y Cm «Major Triad». TryGetModeByName está detrás de get_mode_info. De los 14 nombres de las dos clases de modos de GA, 8 deberían encontrarse y 6 no: Locrian Natural 2, Locrian Natural 6, Ionian Augmented, Dorian Sharp 4, Lydian Sharp 2 y Altered bb7. No debería encontrarse ningún nombre alternativo, «Super Locrian» y «Acoustic Scale» incluidos, porque GetAllModes pone a None los nombres alternativos de cada modo (ModesConfig.fs, línea 284). GetModalFamilies, que lee ModesSkill, los conserva.

2026-10-01 — Lección 11: resultados frente a las predicciones

Sección titulada «2026-10-01 — Lección 11: resultados frente a las predicciones»

El programa es Lesson13.cs (punto de entrada l13), su salida expected/l13.txt; check.sh pasa para las lecciones 1 a 13 y los 18 diagramas. Compila tal cual un archivo más de GA, UnifiedModeService, que fetch-ga.sh añade ahora a su extracción parcial, y copia tal cual TheoryVectorService.IcvBrightness, interno de GA.Business.ML. ModesConfig viene con GA.Business.Config, que el programa ya compilaba. La prueba de los nombres que pierde Modes.yaml no estaba en la primera ejecución: la añadí después, en su propio commit, 13e7607, cuando la primera ejecución me mostró uno.

  1. Confirmada: 7 fórmulas de 7, y las 7 grafías. Los nombres de GA son los de los libros en ASCII, de «Dorian b2» a «Locrian Natural 2».
  2. Confirmada: 7 de 7, notas incluidas. GA llama al séptimo modo «Altered bb7» y al tercero «Ionian Augmented».
  3. Confirmada: 11 de 35, grado por grado.
  4. Confirmada: 0,2857 para los 21 modos, y 11 valores sobre los 4096 conjuntos, uno por tamaño, con los conjuntos de 0, 1 y 4 notas compartiendo 0,5.
  5. Confirmada: 0,642857, 0,595238 y 0,571429, el mismo para cada modo de cada escala.
  6. Confirmada: la mayor y la menor melódica en el orden del curso. Para la menor armónica, 14 conjuntos, el lidio aumentado ♯2 de la mayor armónica primero con 41, y los tres empates en el orden previsto.
  7. Confirmada: 31 familias, 165 modos, 18 vectores declarados, los 9 previstos mal; 60 de los otros 134 modos sin el vector de su familia; el Ultralocrian con el vector de la menor melódica, <2 5 4 4 4 2>.
  8. Confirmada para los vectores, como estaba escrito. Refutada en parte para los nombres: se encuentran 9 de los 14, no 8. «Ionian Augmented» se encuentra, pero en la familia Double Harmonic: el modo que el archivo escribe «Ionian Augmented #2» (Modes.yaml, línea 655) vuelve sin «#2», que YAML lee como un comentario. Yo había leído la familia de la menor armónica, donde «Ionian Augmented» es un nombre alternativo, y no el resto del archivo. Los otros cinco nombres no se encuentran, ni tampoco «Super Locrian», «Acoustic Scale» y «Spanish Phrygian», todos nombres alternativos; GetModalFamilies conserva 104 nombres alternativos, GetAllModes ninguno.

La prueba añadida después de la primera ejecución, en 13e7607: 8 de los 165 nombres pierden sus alteraciones en un comentario YAML, en las líneas 631, 639, 655, 663, 667, 671, 679 y 681, y 7 nombres vuelven para más de un modo. Dos de los siete no son nombres cortados: las familias Minor Second y Major Second llaman a sus inversiones «Major Seventh» y «Minor Seventh», como dos acordes de la familia Major Seventh Chord.

Observaciones, no pruebas:

  • La escala cromática es el único modo cuyo vector calculan de forma distinta el PitchClassSet de GA y el curso: GA <1 1 1 1 0 6>, el curso <12 12 12 12 12 6>. IntervalClassVectorId lo documenta como una «KNOWN LIMITATION» de su codificación en base 12 (IntervalClassVectorId.cs, líneas 3-15). El archivo declara <11 11 11 11 11 6> para su familia, mal en los dos casos.
  • El comentario de HarmonicMajorScaleMode enlaza la escala 2773 de Ian Ring (HarmonicMajorScaleMode.cs, línea 14), que es el lidio, C D E F♯ G A B; la mayor armónica es la 2485. Los enlaces de MelodicMinorMode (2733) y de HarmonicMinorMode (2477) son correctos.
  • get_mode_info imprime el vector declarado de la familia en una línea llamada «Intervals» y termina cada respuesta con «Alternate Names: None» (ModeTool.cs, líneas 27-33). Leído, no ejecutado.

2026-10-01 — Lección 12: predicciones antes de la primera ejecución

Sección titulada «2026-10-01 — Lección 12: predicciones antes de la primera ejecución»

Escritas a partir del código de GA en a826864, antes de que existiera el programa de la lección; la entrada de resultados contrasta cada una con lo que imprimió el programa. Para esta lección no se llamó a ninguna herramienta MCP ni a ningún chatbot.

  1. La transposición limitada. Un conjunto tiene transposiciones limitadas cuando una transposición distinta de T0 lo lleva sobre sí mismo. Si d de las doce transposiciones lo fijan, tiene 12/d transposiciones distintas y, con n notas, n/d modos distintos. De los 4096 conjuntos, 76 deberían cumplirlo, el conjunto vacío y la escala cromática incluidos, en 17 clases de transposición. Sin esos dos, son los 15 «modos de Messiaen generalizados» que cuenta Wikipedia. Se repiten cada 2 semitonos (1 clase, la escala de tonos enteros), cada 3 (2 clases: la séptima disminuida y la escala octatónica), cada 4 (3 clases: la tríada aumentada, la escala aumentada y el tercer modo de Messiaen) o cada 6 (9 clases). Los siete modos de Messiaen deberían tener 2, 3, 4, 6, 6, 6 y 6 transposiciones y 1, 2, 3, 4, 3, 4 y 5 modos, como da su lista. El método UnifiedModeService.IsSymmetricSet de GA prueba lo mismo, Transpose(k) para k de 1 a 11 (UnifiedModeService.cs, líneas 349-362): debería coincidir con el curso en los 4096 conjuntos.
  2. Las tres clases de modos simétricos de GA. WholeToneScaleMode, DiminishedScaleMode y AugmentedScaleMode fijan en el código 2, 3 y 4 transposiciones: los números del curso. Pero sus tipos de grados van de 1 a 6, 8 y 6, así que Items da 20 modos, que forman 1, 2 y 2 conjuntos distintos una vez llevado cada uno a C. Los comentarios de las clases prometen dos, dos y cuatro modos distintos (línea 12 de cada archivo): los números de la escala de tonos enteros y de la aumentada son falsos. «Augmented dominant» y «Augmented mode 5» deberían ser el mismo conjunto que «Augmented», C E♭ E G A♭ B, y «Augmented Lydian» y «Augmented mode 6» el mismo que «Augmented inversed».
  3. Las dos escalas disminuidas. DiminishedScaleMode rota Scale.Diminished, C D E♭ F G♭ A♭ A B (Scale.cs, línea 62), que empieza con un tono. Así que el grado 1, que GA llama «Half-whole diminished», debería ser la escala tono-semitono, y el grado 2, «Whole-half diminished», la semitono-tono: los nombres están intercambiados. Modes.yaml nombra las mismas dos escrituras en el orden correcto (líneas 331-342).
  4. La escala de tritonos. Scale.Tritone es C D♭ E F♯ G A (línea 67). La escala de tritonos, las notas del acorde de Petrushka, es C D♭ E G♭ G B♭, 0 1 4 6 7 10: GA tiene A en lugar de B♭. Las notas de GA deberían formar 6-Z50 (014679), el vector <2 2 4 2 3 2> del ejercicio de la lección 4, con 12 transposiciones y 6 modos; la escala de tritonos es 6-30 (013679), con 6 transposiciones y 3 modos. El comentario de TritoneScaleMode la describe como “a symmetrical scale built from alternating half steps and minor thirds”, con “only two distinct modes” (líneas 11-14). Los pasos de GA son 1 3 2 1 2 3, los de la escala de tritonos 1 3 2 1 3 2, y semitonos alternados con terceras menores dan la escala aumentada.
  5. IdentifyMessiaenMode. Compara el identificador de la forma prima del conjunto, la menor de sus 24 formas (lección 4), con identificadores fijos (UnifiedModeService.cs, líneas 290-347). De los siete modos de Messiaen, debería nombrar los tres primeros. Para los modos 4 a 7 las formas primas son 975, 455, 1495 y 2015, pero GA prueba 2535, 2275, 3315 y 3055, identificadores de otras transposiciones, así que MessiaenModeIndex debería quedar vacío. Los dos conjuntos que su comentario da para el modo 6 son formas del modo 4, y el comentario da al modo 3 tres transposiciones en lugar de cuatro.
  6. IsMonomodal. Es verdadera cuando la familia modal de un conjunto, los conjuntos que contienen 0 con su vector interválico, tiene un solo miembro (PitchClassSet.cs, línea 189). Llena la dimensión de los embeddings llamada “Is Symmetric/Monomodal” (ModalVectorService.cs, línea 132; EmbeddingSchema.cs, líneas 881-882). Debería ser verdadera para 29 conjuntos: las 12 notas sueltas y el conjunto vacío, que comparten el vector <0 0 0 0 0 0>, 6 tritonos, 4 tríadas aumentadas, 3 séptimas disminuidas, 2 escalas de tonos enteros y la escala cromática. Son 17 de los 76 conjuntos con transposiciones limitadas. La escala octatónica, que el comentario de la propiedad pone como ejemplo (línea 187), no está entre ellos, ni la escala aumentada ni los modos 3 a 7 de Messiaen.
  7. AtonalModalFamilies.yaml. Su IsSymmetric es verdadero para 6 de sus 200 familias, las que tienen un solo modo distinto: notas sueltas, tritono, tríada aumentada, séptima disminuida, escala de tonos enteros y escala cromática. ModesSkill responde a «modes of limited transposition» con esas seis (ModesSkill.cs, líneas 596-601 y 687-705), y luego nombra “octatonic (3), and hexatonic (4)”, que su lista omite; la nota suelta que lista tiene 12 transposiciones. Los números de Forte del archivo vienen de ProgrammaticForteCatalog, que numera cada cardinalidad en orden creciente del identificador del vector (ProgrammaticForteCatalog.cs, líneas 123-133), el inverso del orden de Forte para los conjuntos pequeños. La lista debería imprimir 2-1, 3-1, 4-1 y 6-1 para 2-6, 3-12, 4-28 y 6-35. Frente al propio ForteCatalog de GA (lección 4), ninguna de las familias de 2, 3, 4, 8, 9 y 10 notas debería coincidir, mientras que 1-1, 11-1 y 12-1 sí deberían.
  8. AtonalChordAnalysisService.IsSymmetricalSet. Ordena las clases de altura y pregunta si todos los pasos entre vecinas son iguales, dejando fuera el paso de la última a la primera (AtonalChordAnalysisService.cs, líneas 220-233). Debería marcar 156 de los 4096 conjuntos: los 66 conjuntos de dos notas y toda serie igualmente espaciada que cabe entre 0 y 11. 16 de ellos tienen transposiciones limitadas: 6 tritonos, 4 tríadas aumentadas, 3 séptimas disminuidas, 2 escalas de tonos enteros y la escala cromática. Los otros 60 conjuntos con transposiciones limitadas, entre ellos las escalas octatónicas, no deberían marcarse. C D E debería marcarse, y su transposición B♭ C D no.
  9. La simetría especular. TranspositionClass.IsInversionallySymmetric compara la forma prima de una clase con la forma prima por transposición de su inversión (TranspositionClass.cs, líneas 52-53). Debería coincidir con el curso en las 352 clases de transposición, 96 de ellas simétricas: 352 − 224 = 128 clases de conjuntos se dividen en dos clases de transposición, y las otras 96 no. De las 15 clases con transposiciones limitadas, todas salvo las dos formas de 6-30 deberían ser simétricas en espejo, cada una con tantos ejes de simetría como transposiciones que la fijan: 6 para la escala de tonos enteros, 4 para la octatónica, 3 para la aumentada.

2026-10-01 — Lección 12: resultados frente a las predicciones

Sección titulada «2026-10-01 — Lección 12: resultados frente a las predicciones»

El programa es Lesson14.cs (punto de entrada l14), su salida expected/l14.txt; check.sh pasa para las lecciones 1 a 14 y los 20 diagramas. Compila tal cual un archivo más de GA, AtonalChordAnalysisService, que fetch-ga.sh añade ahora a su extracción parcial, y llama por reflexión a su IsSymmetricalSet privado. UnifiedModeService, compilado desde la lección 11, da IsSymmetricSet y MessiaenModeIndex; AtonalModalFamiliesConfig y ModesConfig vienen con GA.Business.Config. ModesSkill pertenece a GA.Business.ML, que el curso no compila, así que el programa reconstruye su respuesta a partir de su formato y los mismos datos. La prueba de cómo llaman los dos catálogos de modos de GA a las quince clases no estaba en la primera ejecución: la añadí después, en su propio commit, 6b4039a, cuando la primera ejecución me mostró «Major Bebop Family».

  1. Confirmada: 76 conjuntos en 17 clases de transposición, 15 sin el conjunto vacío y la escala cromática, en 14 clases de conjuntos; 1, 2, 3 y 9 clases que se repiten cada 2, 3, 4 y 6 semitonos; los siete modos de Messiaen como los da su lista; IsSymmetricSet coincide en los 4096 conjuntos.
  2. Confirmada: 2, 3 y 4 transposiciones; 6, 8 y 6 modos, que forman los conjuntos 1365; 2925 y 1755; 2457 y 819 sobre C. «Augmented dominant» y «Augmented mode 5» son 2457 como «Augmented», «Augmented Lydian» y «Augmented mode 6» 819 como «Augmented inversed».
  3. Confirmada: el grado 1, «Half-whole diminished», tiene los pasos 2 1 2 1 2 1 2 1, y el grado 2 los pasos 1 2 1 2 1 2 1 2.
  4. Confirmada: la escala de GA es 6-Z50, <2 2 4 2 3 2>, con 12 transposiciones y 6 modos; la escala de tritono 6-30, <2 2 4 2 2 3>, con 6 y 3. El propio IsSymmetricSet de GA responde False y True. TritoneScaleMode.Items da 6 modos, 6 conjuntos distintos sobre C.
  5. Confirmada: modos 1 a 3 nombrados, 4 a 7 no. El programa lista los ocho identificadores que prueba el método: 2925, 2535, 2275, 3315 y 3055 no son formas primas, y 3315 es una forma del modo 4.
  6. Confirmada: 29 conjuntos, 1, 12, 6, 4, 3, 2 y 1 de 0, 1, 2, 3, 4, 6 y 12 notas, 17 de ellos limitados; la escala octatónica no está marcada.
  7. Confirmada: 200 familias, 6 con IsSymmetric, 15 con transposiciones limitadas; las seis familias de la respuesta con Forte 1-1, 2-1, 3-1, 4-1, 6-1 y 12-1. Ninguna etiqueta coincide para 2, 3, 4, 8, 9 y 10 notas, y 1-1, 11-1 y 12-1 coinciden. La predicción no decía nada de 5, 6 y 7 notas: una familia de hexacordios coincide, lo que da 4 de 200. Las etiquetas son una salida desfasada, no un error desconocido: GA #436 había pasado el generador a ForteCatalog antes de a826864 (Demos/AtonalModalFamiliesGenerator/Program.cs, línea 183) y dejó para más adelante regenerar el archivo; el archivo no ha cambiado desde 7a4308a, que lo generó.
  8. Confirmada: 156 conjuntos, 16 limitados, 60 conjuntos limitados sin marcar; C D E True, B♭ C D False.
  9. Confirmada: 352 clases de transposición, 96 simétricas por espejo, todas de acuerdo; 13 de las 15 clases limitadas simétricas por espejo, con 6, 4 y 3 ejes para las escalas de tonos enteros, octatónica y aumentada; las dos formas de 6-30 sin ninguno. Ningún conjunto tiene un número de ejes especulares distinto de su número de transposiciones que lo fijan.

La prueba añadida después de la primera ejecución, en 6b4039a: AtonalModalFamilies.yaml nombra seis de las quince clases según Modes.yaml, dos de ellas mal. El cuarto modo de Messiaen es «Major Bebop Family», porque el «Major Bebop Mode 8» de Modes.yaml, C D♭ D F G♭ G A♭ B (líneas 725-726), es el cuarto modo de Messiaen, no una rotación de la escala bebop; la séptima disminuida es «Major Seventh Chord Family», por la «Diminished Seventh» de esa familia (línea 531). TryGetModeByIntervalClassVector solo nombra una clase, el sexto modo de Messiaen, «Diminished (Half-Whole)»: la familia Diminished declara <4 6 4 6 4 4> (líneas 328-329), el vector del sexto modo. La escala octatónica no se encuentra en ninguna parte. Veinte modos de Modes.yaml pertenecen a las quince clases, diez de ellos a la escala octatónica.

Observaciones, no pruebas:

  • ModalCharacteristicIntervalService guarda cada modo simétrico en una base más su grado menos uno, con las bases 206, 208 y 212 (ModalCharacteristicIntervalService.cs, líneas 114-118 y 135): los 8 modos disminuidos se solapan con los 6 de tonos enteros en 208 a 211 y con los 6 aumentados en 212 a 215, así que los índices 208 a 215 se escriben dos veces. Leído, no ejecutado.
  • El constructor de GenericSymmetricScaleMode tiene por defecto hasLimitedTranspositions = true y transpositionCount = 12 (GenericSymmetricScaleMode.cs, líneas 23-27), dos valores que se contradicen.
  • Las pruebas de GA para los modos 5 a 7 de Messiaen afirman Is.Null.Or.EqualTo(...), y la del modo 6 construye 3315, una forma del modo 4 (UnifiedModeAdvancedTests.cs, líneas 87-119).
  • El comentario de ProgrammaticForteCatalog llama “minor” a sus diferencias con la numeración de Forte (líneas 16-18); el de ForteCatalog dice que divergen “for most set classes” y no deben mostrarse (líneas 9-12).
  • MUS-006 dice que las escalas simétricas no son quirales. La escala de tritono tiene transposiciones limitadas y ningún eje especular.

2026-10-01 — Lección 13: predicciones antes de la primera ejecución

Sección titulada «2026-10-01 — Lección 13: predicciones antes de la primera ejecución»

Escritas a partir del código de GA en a826864, antes de que existiera el programa de la lección; la entrada de resultados contrasta cada una con lo que imprimió el programa. Para esta lección no se llamó a ninguna herramienta MCP ni a ningún chatbot. El curso lee 41 cifrados de acordes sobre C: 14 acordes extendidos, 11 acordes alterados, 12 escrituras de acordes habituales tomadas de Open Music Theory y de Wikipedia, dos acordes con bajo indicado y dos palabras inglesas.

  1. Dos analizadores de cifrados. El C# de GA tiene dos: Chord.FromSymbol en GA.Domain.Core (Chord.cs, líneas 75-140) y ChordSymbolParser en GA.Domain.Services (ChordSymbolParser.cs, líneas 56-189), al que llaman el VoicingFilterService de GaApi y el SpectralRagOrchestrator del chatbot. Los dos pasan el sufijo a minúsculas y lo buscan en una tabla.
    • FromSymbol debería leer bien 14 de los 41: los 11 acordes extendidos de su tabla (9, maj9, m9, 11, maj11, m11, 13, maj13, m13, 6/9, add9), Cø7, y las dos palabras, que rechaza. Debería lanzar una excepción con los otros 26 acordes: todos los alterados, C7sus, C9sus4, Cadd2, los dos acordes con bajo indicado, y las escrituras de los propios manuales, Cmi, Cmi7, Cma7, Co7, C∆7 (el ∆ de Open Music Theory, U+2206; GA acepta △, U+25B3), CΔ7 (la Δ griega de Wikipedia), Cm(b5), Cm7♭5 (con el signo ♭), C+7 y Cm(maj7). CM7, una séptima mayor, debería volver como séptima menor de C: es m7 una vez en minúsculas.
    • ChordSymbolParser no debería lanzar excepción con ninguno y debería leer bien 17. Después de su tabla prueba Contains("alt"), luego b5, #5, b9, #9, #11 y b13, y devuelve una tríada mayor cuando nada coincide (líneas 98-140). Así, C7b9, C7#9, C7b13, Cmaj7#11 y las clases de altura de C/E salen bien. C7b5 y C7#5 pierden su séptima (C E G♭, C E G♯); C7#11 y C9#11 reciben una séptima mayor (C E G B F♯); C7alt recibe una quinta justa y ninguna quinta alterada (C E G B♭ D♭ D♯); C7b9#11 y C7#9b13 pierden su segunda alteración; Cm(b5) sale como C E G♭; CM7 vuelve a ser una séptima menor. Cmi, Cmi7, Cma7, Co7, C∆7, CΔ7, Cm7♭5, C+7, Cm(maj7), C7sus, C9sus4, Cadd2 y C/F# salen todos como tríada de C mayor, y las palabras también: “Can” da C mayor, “Give” G mayor. Las pruebas de GA cuentan C7b5, C7#5, Galt y C/E entre los cifrados válidos y solo comprueban que vuelve un acorde (ChordSymbolParserTests.cs, líneas 11-18 y 33-40).
  2. Los acordes extendidos, releídos. FromSymbol construye cada 11 y cada 13 como la pila completa de terceras, con los intervalos compuestos 14, 17 y 21 (Chord.cs, líneas 131-136). Así, C13 tiene siete notas, la colección de F mayor, el mismo conjunto que Fmaj13 y Gm13. El CanonicalChordPatternCatalog de GA guarda los voicings que tocan los músicos, el 13 sin su oncena y el 11 mayor sin su tercera (CanonicalChordPatternCatalog.cs, líneas 82-91): TryFindExact no debería encontrar nada para C13, Cmaj13, Cm13 y Cmaj11, y debería nombrar los otros siete. ChordFormula.GetSymbolSuffix debería perder el «maj» de maj9, maj11 y maj13, como pierde el de maj7 (lección 3), mientras que BasicChordExtensionsService.GenerateChordName (líneas 164-178), a partir de la misma calidad y la misma extensión, debería nombrar bien los once.
  3. Las alteraciones, nombradas por ChordAlterationService. Un intervalo de acorde lleva una Function, pero todos los constructores que encontró el curso la rellenan a partir de los semitonos módulo 12 (ChordFunctionExtensions.FromSemitones, líneas 13-22): 3 es una tercera, 6 y 8 son quintas, y 1 cae en Root. DetectAlterationFromSemitones (líneas 87-102) lee entonces 1 como ♭9, 6 como ♭5 y 8 como ♯5, y nunca 3 como ♯9, y GenerateNameWithAlterations (líneas 37-61) llama «7alt» a una séptima de dominante con cualquier alteración. Los nueve «acordes alterados comunes» del propio GA (líneas 186-202), construidos a partir de sus descripciones y pasados como GA construye una plantilla analítica (ChordTemplate.Analytical.FromPitchClassSet), deberían volver todos con otro nombre: C7alt como C9(b9,b5,#5), C7(♭9) como C9(b9), C7(♯9) como C7 sin alteración, C7(♭5), C7(♯5), C7(♯11) y C7(♭13) los cuatro como C7alt, C7(♭9,♯11) como C9(b9,b5), y Cmaj7(♯11) como Cmaj7(b5). Las quintas que definen un acorde también deberían contar como alteraciones: Cdim(b5), Caug(#5), Cdim7(b5) para Cm7♭5 y C6(b5) para Cdim7.
  4. Todas las plantillas de ChordTemplateFactory. GenerateAllPossibleChords devuelve GenerateFromAllModalFamilies, que ya recorre las escalas tradicionales, simétricas y pentatónicas, y luego recorre las tres otra vez (ChordTemplateFactory.cs, líneas 37-62 y 93-115): cada plantilla debería aparecer dos veces, con la segunda mitad repitiendo la primera. En esas plantillas, ChordAlterationService no debería encontrar nunca ♭13, y solo debería encontrar ♯9 en las plantillas Sus2 y ♯11 en las Sus4, el único lugar donde la fábrica fija la función a mano (línea 495).
  5. Los poliacordes. ga_polychord une las clases de altura de dos acordes (ChordAtonalTool.cs, líneas 194-218). Su descripción promete “B triad over C triad → Lydian mode set {C,D,E,F#,G,B}” (línea 198), pero una tríada de B mayor es B D♯ F♯: el propio código de la herramienta, leído con domain.chordIntervals (DomainClosures.fs, líneas 85-92 y 199-227), debería imprimir {C, Eb, E, F#, G, B}. {C, D, E, F♯, G, B} es B menor sobre C. De los 28 modos de las escalas mayor, menor melódica, menor armónica y mayor armónica construidos sobre la fundamental del acorde de abajo, solo el lidio debería contener Bm/C, y solo el lidio ♯2, el sexto modo de la menor armónica, B/C. AdvancedHarmony.yaml dice que C mayor sobre F♯ mayor “Creates all 12 chromatic pitches” (línea 104): da seis, C D♭ E F♯ G B♭, el acorde de Petrushka y la escala de tritono de la lección 12, 6-30, que ninguno de los 28 modos contiene y que la escala octatónica semitono-tono sí contiene. La habilidad polychord, todavía pendiente, atribuye a D sobre E♭ un “Lydian-augmented colour” (DRAFT.md, línea 47): sobre E♭, solo el lidio ♯2 debería contenerlo, no el lidio aumentado. Su lectura de C sobre D, A C D E F♯ G, debería ser correcta.
  6. El YAML que recupera el chatbot. Ningún cargador tipado lee ExtendedChords.yaml, pero YamlKnowledgeLoader aplana cada archivo YAML que no tiene uno en entradas de conocimiento para la búsqueda (YamlKnowledgeLoader.fs, líneas 25-31 y 131-140). Debería devolver 3 entradas de ExtendedChords.yaml, cuyo acorde de 13.ª, 1 3 5 ♭7 9 13, es el del catálogo y no el de los analizadores, y 9 de AdvancedHarmony.yaml, entre ellas «Polychords» con sus 12 alturas cromáticas.
  7. Las estructuras superiores. Una tríada mayor o menor sobre C7 añade tensiones. El curso conserva las tríadas sin oncena natural (F, una novena menor por encima de la tercera) y sin séptima mayor (B, contra la séptima menor). Deberían quedar 6 tríadas mayores y 6 menores: las nueve estructuras superiores de Wikipedia (US II, ♭III, ♭V, ♭VI, VI, i, ♭ii, ♭iii y ♯iv) y tres más, C mayor, el propio acorde, G menor (5, ♭7, 9) y A menor (13, 1, 3). El catálogo de GA no tiene ningún patrón de estructura superior ni de poliacorde, aunque su comentario reserva las prioridades 90 a 99 a los “polychord fragments” (CanonicalChordPatternCatalog.cs, línea 26).

2026-10-02 — Lección 13: resultados frente a las predicciones

Sección titulada «2026-10-02 — Lección 13: resultados frente a las predicciones»

El programa es Lesson15.cs (punto de entrada l15), su salida expected/l15.txt; check.sh pasa para las lecciones 1 a 15 y los 21 diagramas. Compila tal cual tres archivos más de GA, ChordSymbolParser, BasicChordExtensionsService y ChordAlterationService, que fetch-ga.sh añade ahora a su extracción parcial. ga_polychord pertenece al servidor MCP y lee una closure F# de GA.Business.DSL; el curso no compila ninguno de los dos, así que el programa copia el código de la herramienta y reemplaza la closure por los intervalos de tríada que devuelve. La prueba del D♭/C de MUS-005 no estaba en la primera ejecución: la añadí después, en su propio commit, ac620ce, al escribir la lección.

  1. Confirmada: FromSymbol lee bien 14 de 41 y rechaza 28 cifrados, los 26 acordes y las dos palabras; CM7 vuelve como 0 3 7 T. ChordSymbolParser lee bien 17 y no rechaza ninguno; cada lectura errónea es como estaba escrito, «Can» 0 4 7 y «Give» 2 7 E.
  2. Confirmada: TryFindExact nombra 7 de 11, nada para C13, Cmaj13, Cm13 y Cmaj11; GetSymbolSuffix devuelve 8, con C9, C11 y C13 para los tres acordes mayores; GenerateChordName 11. C13, Fmaj13, Gm13 y la escala de F mayor son un solo conjunto.
  3. Confirmada: los nueve nombres y los cuatro acordes definidos por su quinta, como estaba escrito. La predicción no decía que SuggestedNotation llama al F♯ de Cmaj7(♯11) «Flat fifth (tritone substitution)», ni que el catálogo nombra siete de los nueve.
  4. Confirmada: 25 900 plantillas, con la segunda mitad repitiendo la primera; ♭13 en ninguna, ♯9 en 80 plantillas Sus2, ♯11 en 176 plantillas Sus4.
  5. Confirmada, con una cita corregida: los cinco conjuntos reunidos y los modos que los contienen son como estaba escrito, pero el “Lydian-augmented colour” del borrador está en la línea 46 de DRAFT.md, no en la 47. No predicho: la ficha imprime «24 modes» para 6-Z19, la familia amplia de la lección 2, y «mode 0» para D sobre E♭, cuyo conjunto no tiene C, de modo que ModeIndex vale −1.
  6. Confirmada: 3 y 9 entradas, el acorde de 13.ª sin su oncena, y la entrada Polychords con «Creates all 12 chromatic pitches». No predicho: el mismo cargador devuelve el acorde de Petrushka de IconicChords.yaml con sus seis clases de altura.
  7. Confirmada: 12 tríadas, las nueve de Wikipedia con C, Gm y Am; ningún patrón del catálogo nombrado para una estructura superior o un poliacorde, 0 de 62.

La prueba añadida después de la primera ejecución, en ac620ce: D♭/C es 0 1 5 8, 1 ♭9 11 ♭13 sobre C, contenido en el frigio, el locrio, el frigio dominante y el locrio ♭♭7; D/C es 0 2 6 9, en seis modos, con el lidio primero; Cmaj7♯11 en el lidio y el lidio ♯2. El “Cmaj7#11 sound” de MUS-005 es D/C, no D♭/C.

Observaciones, no pruebas:

  • Los tres voicings de guitarra de la figura, que dejan fuera la quinta, no coinciden con ningún patrón de TryFindExact.
  • Al cargar, YamlKnowledgeLoader imprime en la salida de error “Skipping SpecializedTunings.yaml: While parsing a flow sequence, did not find expected ‘,’ or ‘]’.”: uno de los archivos de contenido de GA no se analiza, y sus entradas nunca llegan a la búsqueda.
  • El manejador de progresiones de SpectralRagOrchestrator conserva cada palabra que acepta ChordSymbolParser, menos una lista corta de palabras que omite «Can» (SpectralRagOrchestrator.cs, líneas 217-226). Leído, no ejecutado.
  • La tabla de estructuras superiores de MUS-005 da B♭ mayor sobre C7, cuya F es la oncena, como “the sus/11 sound”; solo es un acorde sus una vez quitada la tercera.

2026-10-02 — Lección 14: predicciones antes de la primera ejecución

Sección titulada «2026-10-02 — Lección 14: predicciones antes de la primera ejecución»

Escritas a partir del código de GA en a826864, antes de que existiera el programa de la lección; la entrada de resultados contrasta cada una con lo que imprimió el programa. Para esta lección no se llamó a ninguna herramienta MCP ni a ningún chatbot. El curso toma la definición de los voicings drop de Wikipedia: las voces de un acorde en posición cerrada, todas dentro de una octava, se numeran desde arriba, y un voicing drop n baja la voz n una octava.

  1. Los voicings drop, por definición. Para los cuatro acordes de séptima sobre C (maj7, 7, m7, m7♭5), cada una de sus cuatro posiciones cerradas (una por nota superior) y cada elección de voces bajadas entre las voces 2, 3 y 4 (ninguna, una, dos o las tres), el curso construye 128 voicings y vuelve a nombrar cada uno. El VoicingHarmonicAnalyzer de GA sube la nota más grave una octava y responde «Drop-2» cuando las notas caben entonces en una octava, y nada en caso contrario (VoicingHarmonicAnalyzer.cs, líneas 46-58). Con cuatro notas de cuatro clases de altura distintas, eso es «Drop-2» exactamente cuando se baja como mucho una voz: GA debería llamar «Drop-2» a los 64 voicings cerrados, drop 2, drop 3 y drop 4, y dejar sin nombre a los otros 64. No responde nada más, así que los filtros Drop3 y Drop2And4 de VoicingFilters, que buscan «Drop-3» y «Drop-2+4» (VoicingFilters.cs, líneas 114-116), no deberían retener ninguno. La prueba necesita cuatro notas: los tres voicings drop 2 de la tríada de C mayor que da Wikipedia y sus cuatro voicings drop 2 y 4 de G7, que el curso debería reconstruir tal como están escritos (C E G, G C E, E G C; G D F B, B F G D, D G B F, F B D G, leyendo desde arriba), no deberían recibir nada.
  2. Sin fundamental y abierto. VoicingCharacteristics tiene IsRootless, DropVoicing e IsOpenVoicing en ese orden (VoicingCharacteristics.cs, líneas 10-12), y Analyze pasa intervalSpread > 12, la etiqueta drop y false (VoicingHarmonicAnalyzer.cs, líneas 38-40). Para GA, un voicing es por tanto «rootless», sin fundamental, cuando abarca más de una octava, y ningún voicing es abierto. De los 128 voicings, que contienen todos su fundamental, los 112 que tienen una voz bajada deberían ser sin fundamental, y ninguno abierto. ChordClassificationEngine etiqueta entonces cada voicing closed-voicing y cada «Drop-2» drop-2-voicings, incluidos los cerrados (ChordClassificationEngine.cs, líneas 158-167). En formas de guitarra, los siete acordes abiertos de la lección 3 deberían ser todos sin fundamental, y tres de ellos «Drop-2»: x32010 (C), x02210 (Am) y xx0232 (D), donde las notas caben en una octava una vez subido el bajo una octava; 032010, 022100, 320003 y 133211 no reciben nada. El “Drop-2 Cmaj7 (string set 5-4-3-2)” de MUS-005, x3200x, es C E G B dentro de una octava, una posición cerrada: GA debería llamarlo «Drop-2», como la página, y no sin fundamental. El voicing drop 2 con C en el bajo sobre esas cuerdas, x3545x (C G B E), debería ser «Drop-2» y sin fundamental.
  3. Los shells. El curso toca fundamental, tercera y séptima en las cuerdas Freddie Green de MUS-005: G7, Gmaj7 y Gm7 con la fundamental en la sexta cuerda (3x34xx, 3x44xx, 3x33xx, cuerdas 6-4-3, la séptima debajo de la tercera), C7, Cmaj7 y Cm7 con la fundamental en la quinta (x323xx, x324xx, x313xx, cuerdas 5-4-3, la tercera debajo de la séptima). Los tres primeros abarcan 15 o 16 semitonos, los otros 10 u 11: GA debería decir que los tres primeros son sin fundamental, aunque su fundamental está en el bajo, y los otros no. Tres reglas de GA deciden qué es un shell, y ninguna mira las notas del acorde:
    • VoicingPhysicalAnalyzer da la ShellFamily «3-4 note shell», y la etiqueta shell-voicing, a todo voicing sobre tres o cuatro cuerdas (VoicingPhysicalAnalyzer.cs, líneas 126-131 y 204): los seis shells, xx0232, x3200x y todos los voicings drop sobre cuatro cuerdas.
    • ChordClassificationEngine etiqueta shell-voicing un voicing sin fundamental de tres clases de altura (líneas 169-173): los tres shells de la sexta cuerda, no los de la quinta, y las siete tríadas abiertas de la lección 3.
    • El filtro ShellVoicings de VoicingFilters guarda un voicing sin fundamental de tres notas MIDI distintas (líneas 118-119): los tres shells de la sexta cuerda y nada más aquí; las tríadas abiertas tienen de cuatro a seis notas.
  4. Todos los voicings que genera GA. VoicingGenerator desliza una ventana de cinco trastes a lo largo del mástil de 24 trastes y guarda toda combinación de cuerdas apagadas y trastes de la ventana que toque al menos dos notas (VoicingGenerator.cs, líneas 18-144 y 156-292). Con seis opciones por cuerda, una ventana da 6⁶ − 31 = 46 625 voicings, y dos ventanas vecinas comparten 5⁶ − 25 = 15 600: ejecutado en secuencia, debería devolver 21 × 46 625 − 20 × 15 600 = 667 125 voicings. El curso guarda los que tocan las cuatro notas de un acorde de séptima sobre C en cuatro cuerdas. La etiqueta de GA debería ser «Drop-2» exactamente en los que el curso encuentra cerrados, drop 2, drop 3 o drop 4. Las 48 formas drop 2 que cuenta MUS-005 (4 cualidades × 4 inversiones × 3 grupos de cuerdas contiguas) deberían estar todas, ya que ninguna abarca más de cuatro trastes, el límite de GA, y también las 32 formas drop 3 en sus cuerdas 6-4-3-2 y 5-3-2-1. Sobre esos voicings, VoicingFilters debería guardar con Drop2 los voicings cerrados junto con los drop 2, drop 3 y drop 4; con ClosedPosition, todos; con OpenPosition, Drop3, Drop2And4 y ShellVoicings, ninguno; con Rootless, los que se extienden más de una octava.
  5. Las notas guía. En un ii–V–I, la tercera de ii es la séptima de V y la tercera de V la séptima de I, mientras que las séptimas de ii y de V bajan un semitono hacia la tercera siguiente. Las TransposeTables de GA dan el ii–V–I mayor en doce tonalidades (ChordProgressions.yaml, líneas 581-618): el curso debería encontrar esos cuatro movimientos en cada fila, y en C las dos líneas F F E y C B B detrás del “C-B, F-E” de MUS-005. VoicingAnalyzer.AnalyzeEnhanced construye cada ToneInventory como new ToneInventory([], false, [], []) (VoicingAnalyzer.cs, línea 155): HasGuideTones debería valer false, y Tones y OmittedTones estar vacíos, para cada voicing que analiza el curso, incluidos los shells.
  6. Las recetas de acompañamiento de GA. ChordProgressions.yaml enumera seis GuitarCompingRecipes con quince digitaciones sobre grupos de cuerdas con nombre (líneas 461-577). Su cargador tipado solo lee la lista ChordProgressions (ChordProgressionsConfigLoader.cs, líneas 41-44), pero YamlKnowledgeLoader, que se salta cinco archivos y no este (YamlKnowledgeLoader.fs, líneas 25-31), debería devolver las seis recetas para la búsqueda, digitaciones incluidas. Leídas de grave a agudo sobre sus cuerdas en afinación estándar, como dicen las convenciones del archivo (línea 464), ninguna digitación debería dar las notas de su nombre ni de su orden de grados:
    • El ii–V–I mayor, un “Rootless Drop-2 set” en las cuerdas 6-4-3-2, cuerdas de drop 3: “Dm9: x-5-5-5” da G C E; “G7(13,#9): x-5-4-6” da G B F, el shell de G7 con su fundamental; “Cmaj9: 8-x-9-9-10” tiene cinco trastes para cuatro cuerdas y, leído desde la sexta cuerda, da C B E A.
    • El iiø–V–i menor, en 5-4-3-2: “Dm7b5(11): 5-6-5-6” da D A♭ C F, un Dm7♭5 drop 2 con su fundamental y sin oncena; “G7(b9,#9): 5-4-5-5” da D F♯ C E, D9 sin su quinta, sin ninguna de las cuatro notas que enumera su orden de grados (B F A♭ A♯); “Cm(maj9): 3-5-4-5” da C G B E, un Cmaj7 drop 2.
    • El bucle pop, en 5-4-3-2: “G(add9): 10-12-12-10” da G D G A, sin B; “D(add9)/A: 12-11-11-12” da A C♯ F♯ B, sin D; “Em(add9): 7-9-9-7” da E B E F♯, sin G; “C(add9)/G: 10-10-9-10” da G C E A, sin D.
    • La receta rock, en 6-5-4-3: “A5(add2): 5-7-7-7” da A E A D, una cuarta en lugar de una segunda; “Gsus2: 3-5-5-5” da G D G C, un Gsus4; “Dsus2/F#: 2-5-7-7” da F♯ D A D, D mayor sobre su tercera.
    • Los “Stacked 4ths (no 3rd)” del vamp “So What”: “Dm11: 5-7-9-10” da D A E A y “Ebm11: 6-8-10-11” da E♭ B♭ F B♭, dos quintas y una cuarta.
    • La receta de blues no da trastes; su E7, “7th on D string, 3rd on G string”, es correcto: D es la cuarta cuerda al aire y G♯ el primer traste de la tercera.

2026-10-02 — Lección 14: resultados frente a las predicciones

Sección titulada «2026-10-02 — Lección 14: resultados frente a las predicciones»

El programa es Lesson16.cs (punto de entrada l16), su salida expected/l16.txt; check.sh pasa para las lecciones 1 a 16 y los 22 diagramas. Compila tal cual doce archivos más de GA.Domain.Services, el generador, los analizadores y los filtros de voicings con el reconocedor de acordes y las distancias de trastes que llaman, y trece archivos de GA.Business.Core, los doce registros de análisis que devuelven y una clase de constantes; fetch-ga.sh los añade ahora a su extracción parcial. La compilación da un aviso, CS8604, en el propio VoicingAnalyzer.cs de GA (línea 198), donde un ModeInfo que puede ser nulo pasa a un parámetro que no admite nulo. No se llamó a ninguna herramienta MCP ni a ningún chatbot, y no se añadió ninguna prueba después de la primera ejecución.

  1. Confirmada: 64 «Drop-2», 64 nada, ninguna otra etiqueta; «Drop-2» exactamente cuando como mucho una voz está bajada. Los siete ejemplos de Wikipedia se reconstruyen como estaba escrito, y GA no nombra ninguno.
  2. Confirmada: 112 «rootless», ninguno abierto, los 128 con su fundamental; cada voicing etiquetado closed-voicing, cada «Drop-2» drop-2-voicings, los cerrados incluidos. En las formas, los siete acordes abiertos de la lección 3 son «rootless», y x32010, x02210 y xx0232 «Drop-2»; x3200x es «Drop-2» y no «rootless», x3545x «Drop-2» y «rootless».
  3. Confirmada: la regla de las cuerdas en los seis shells, xx0232, x3200x y x3545x; el motor en los tres shells en la sexta cuerda y las siete tríadas abiertas; el filtro en los tres shells en la sexta cuerda y nada más.
  4. Confirmada: 667 125 voicings; «Drop-2» exactamente en los voicings cerrados, drop 2, drop 3 y drop 4 del curso; 48 de 48 formas drop 2 y 32 de 32 formas drop 3, ninguna más ancha que cuatro trastes; Drop2 264, ClosedPosition 687, Rootless 672, exactamente los que se extienden más de una octava, OpenPosition, Drop3, Drop2And4 y ShellVoicings ninguno. No predicho: 687 voicings en total, 141 de ellos más allá de los drops; drop 2 en siete grupos de cuerdas, los cuatro que faltan en la tabla de MUS-005 saltando cada uno una cuerda; las formas más anchas llegan exactamente al límite de cuatro trastes.
  5. Confirmada: 12 filas de 12 con los cuatro movimientos, F F E y C B B en C; sobre 711 análisis, HasGuideTones nunca verdadero, Tones y OmittedTones siempre vacíos.
  6. Confirmada: una entrada para cada una de las seis recetas, con todas sus digitaciones; las quince digitaciones dan las notas escritas de antemano, ninguna las de su nombre o de su orden de grados; el E7 de la receta de blues es correcto. No predicho: el cargador devuelve 36 entradas de ChordProgressions.yaml.

Observaciones, no pruebas:

  • InterpretationService, cuyo único llamador, el IndexVoicingsCommand de GaCLI, está excluido de la compilación (GaCLI.csproj, línea 18), busca «drop 2» y «drop 3» con un espacio (InterpretationService.cs, líneas 41-46), mientras que DropVoicing contiene «Drop-2»: sus etiquetas de drop nunca se activan. Leído, no ejecutado.
  • MUS-005, tal como decía en Demerzel 6aef19b hasta que Demerzel #1098 lo corrigió, llamaba a x3200x, una posición cerrada, un “Drop-2 Cmaj7”; decía “Drop-2 voicings exist on four string sets” encima de una tabla de tres filas; sus diagramas de shells mostraban una nota por acorde.
  • La sección sobre los voicings drop del artículo “Voicing (music)” de Wikipedia lleva el aviso “This section does not cite any sources”.

2026-10-02 — Lección 15: predicciones antes de la primera ejecución

Sección titulada «2026-10-02 — Lección 15: predicciones antes de la primera ejecución»

Escritas a partir del código de GA en a826864, una vez compilado el programa de la lección y antes de su primera ejecución; las cifras se calcularon a mano a partir de las fórmulas de GA, y la entrada de resultados contrasta cada una con lo que imprimió el programa. Para esta lección no se llamó a ninguna herramienta MCP ni a ningún chatbot. El curso sitúa el traste n a d(n) = L(1 − 2^(−n/12)) de la cejuela, lee cada forma desde la cuerda 6 en afinación estándar y toma el sistema CAGED del artículo «Bar chord» de Wikipedia.

  1. Dónde van los trastes. FretboardGeometry.CalculateSpanMm(0, n) multiplica 2^0 − 2^(−n/12) por 647,7 mm (FretboardGeometry.cs, líneas 17-32), y PhysicalFretboardCalculator.CalculateFretPositionMm(n) calcula 648 · (1 − 2^(−n/12)) (PhysicalFretboardCalculator.cs, líneas 35-43). Los dos deberían coincidir con el curso en cada traste, sobre dos longitudes de escala separadas por 0,3 mm: el traste 12 a 323,85 y 324,00 mm. La calculadora debería dar los 36,4, 162,5, 215,5, 324 y 486 mm de MUS-009. PHYSICAL_PLAYABILITY_IMPROVEMENTS.md cita 120,11, 85,42 y 70,09 mm para los trastes 0-5, 7-12 y 12-17, con el tramo grave «71.4% larger» que el agudo. La fórmula da 162,55, 108,49 y 81,27 mm, y como cada distancia se reduce a la mitad una octava más arriba, el tramo grave mide exactamente el doble que el agudo: tres filas DIFF, y un 100,0 % más.
  2. Hasta dónde llega una mano. ComfortableReachScaleUnits vale 0,21, con el comentario «(1 - 2^(-4/12)) approx 0.206», la distancia de la cejuela al traste 4 (BiomechanicsConstants.cs, líneas 25-28). PhysicalCostService la compara con el tramo de las notas pisadas solamente (PhysicalCostService.cs, líneas 25-38, y FretboardGeometry.cs, líneas 38-57): las cuerdas al aire nunca cuentan, así que el traste más bajo desde el que mide es el 1. Desde el traste 1, el alcance debería cubrir los trastes 1 a 5; desde el traste 7, los trastes 7 a 13; desde el traste 12, los trastes 12 a 21, diez trastes. La primera posición, índice en el traste 1 y meñique en el traste 4, mide 0,1502, holgadamente dentro. El PlayerProfile por defecto tiene una HandSize Medium y un MaxComfortableStretchMm de 129 mm (PlayerProfile.cs, líneas 14-17), y ninguno de los tres analizadores lee ninguno de los dos.
  3. CAGED. Las cinco formas abiertas deberían dar exactamente los grados de GTR-002. Subidas hasta que su fundamental sea C, deberían quedar en los trastes 0, 3, 5, 8 y 10, como dice Wikipedia, cada una abarcando tres o cuatro trastes y tocando solo C, E y G. En cada tonalidad, el orden al subir por el mástil debería ser C A G E D leído en círculo desde una de sus letras; en G, G E D C A en los trastes 0, 3, 5, 7 y 10, la secuencia de Wikipedia. El tercer ejercicio de GTR-002 pide C en la cuerda 2 «in each of the five CAGED positions»: solo la forma de C (traste 1) y la de D (traste 13) lo tienen ahí; las formas de A, G y E tocan E, E y G en esa cuerda. DetectCagedShape de GA devuelve null en cuanto el índice 0 está apagado (VoicingPhysicalAnalyzer.cs, líneas 264-265), y sus pruebas de A y de C exigen las dos el índice 0 apagado (líneas 297 y 323): solo puede responder «E-Shape». Sus comentarios leen el índice 0 como la cuerda 6 (línea 263), mientras que ExtractPhysicalLayout numera el índice 0 como la cuerda 1 (línea 27), el orden de los voicings de GA. En ese orden no debería reconocerse ninguna forma de E; el patrón que sí se reconoce, 001220 desde la cuerda 6, toca E A D♯ A C♯ E. Invertida, la forma de E debería reconocerse en cada traste, y nada más. La etiqueta que escribe es e-shape (línea 203), que no contiene ni «CAGED-E» ni «E shape», las cadenas que busca VoicingFilterEngine (VoicingFilterEngine.cs, líneas 61-66; leído, no ejecutado).
  4. El esfuerzo de una forma. PhysicalCostService.CalculateStaticCost no tiene ningún término para una cejilla (PhysicalCostService.cs, líneas 17-142). En estas formas debería reducirse a la tensión de las cuerdas pisadas, a un término de registro cuando el traste medio está por debajo de 3 o por encima de 9, y a una bonificación por cada cuerda al aire: los acordes abiertos por debajo de cero, de −0,63 (Em) a −0,06 (D); F 0,29; las formas de A, G y E de C 0,21, 0,24 y 0,24; la forma de D de C 0,59, y la forma de E en el traste 12 la más alta, 0,66. VoicingPhysicalAnalyzer debería llamar «Intermediate» al C abierto, porque su tramo pisado, 66,7 mm sobre 648 mm, supera 0,8 × 80 mm, y «Beginner» a Am, Em, E, G y D; solo encuentra una cejilla en tres cuerdas adyacentes en el mismo traste, así que en x35553 y 875558, y no en F ni en las formas de E. BiomechanicalAnalyzer encuentra una cejilla siempre que tres notas comparten un traste, cuerdas al aire incluidas (BiomechanicalAnalyzer.cs, línea 153): Em, E y G deberían tener una, junto con F y las formas con cejilla, mientras que Am, C, D y la forma de D de C no. Debería calificar F de «Very Easy» (0,92), con Em y E, por encima del C abierto (0,82, «Easy»). Su HandSize nunca se lee, así que los cuatro tamaños de mano deberían dar los mismos análisis; PhysicalCostService tampoco lee la HandSize ni el MaxComfortableStretchMm del perfil. Con PlayerProfile.Beginner(), las formas por encima del traste 5 deberían costar más, la forma de D de C 1,04, y con Jazz() esa forma debería costar 0,18.
  5. Las afinaciones abiertas. Tunings.toml debería contener las mismas 15 entradas de guitarra que Instruments.yaml, donde MUS-009 encontró la cuerda 2 de Open C y de Open A una octava demasiado grave. Como cambios respecto a la estándar, OpenCMajor debería bajar la cuerda 2 11 semitonos y OpenAMajor 10, mientras que las otras nueve afinaciones de seis cuerdas no mueven ninguna cuerda más de 2. Sus cuerdas al aire deberían sonar el acorde que da su nombre, salvo OpenEMajorV2, «Open E - 2 Minor», un acorde de E menor. Los órdenes de cuerdas de Wikipedia para open C, D, E y G deberían coincidir. Ningún código C# ni F# de GA lee el archivo; un componente React lo menciona como URL de datos opcional e ignora la propiedad.
  6. La tabla detrás de ga_easier_voicings. Los 41 voicings de la herramienta (GuitaristProblemTools.cs, líneas 506-562) deberían dar todos en Notes las notas de su símbolo. Leídos en afinación estándar, Gsus4 310013 debería tocar un B♭ y C5 x3500x un B, fuera de sus acordes, y C7 x32310 debería omitir su quinta, G. Cinco llevan HasBarre, F, B♭, B, Bm y F5; cuatro tienen más de cuatro notas pisadas, y F5 tiene tres. Con la restricción por defecto «no-barre», la herramienta solo ofrece voicings de la tabla sobre la misma fundamental (líneas 611-652): Fmaj7 para F y F5, B7 y B5 para B y Bm, ninguno de los dos con el D de B menor, y nada para B♭. El Fsus2 (133011) y el C/F de la descripción no están en la tabla.

2026-10-02 — Lección 15: resultados frente a las predicciones

Sección titulada «2026-10-02 — Lección 15: resultados frente a las predicciones»

El programa es Lesson17.cs (punto de entrada l17), su salida expected/l17.txt; check.sh pasa para las lecciones 1 a 17 y los 23 diagramas. Compila tal cual siete archivos más de GA.Domain.Services, la geometría del mástil, el servicio de coste con el registro de posición y la interfaz de clasificación que recibe, y el analizador biomecánico con los registros que devuelve, y PlayerProfile de GA.Business.Core; lee como texto Tunings.toml y GuitaristProblemTools.cs, un archivo del servidor MCP de GA. fetch-ga.sh los añade ahora a su extracción parcial. La compilación no da ningún aviso nuevo. No se llamó a ninguna herramienta MCP ni a ningún chatbot, y no se añadió ninguna prueba después de la primera ejecución. Tras una revisión independiente, ce3a9ed corrige las etiquetas de las dos tablas de Wikipedia, que imprimían la cabecera del curso sobre la cifra de Wikipedia, y de la tabla de afinaciones, que decía que GA lee Instruments.yaml, y marca la extensión desde el traste 15 como detenida en el traste 24; ninguna cifra cambió.

  1. Confirmada: cada traste correcto sobre 647,7 y 648 mm, el traste 12 a 323,85 y 324,00 mm; la razón 1,059463 en los 24 trastes; las cinco cifras de MUS-009; tres filas DIFF, 162,55, 108,49 y 81,27 mm, la distancia de abajo un 100,0 % mayor.
  2. Confirmada: 0,21 frente a 0,2063; los trastes 1 a 5 desde el traste 1, 7 a 13 desde el traste 7, 12 a 21 desde el traste 12; la primera posición en 0,1502; el perfil por defecto Medium y 129,0 mm, que ninguna medida lee. No predicho: los demás trastes de partida, 2, 3, 5 y 9, que llegan a los trastes 6, 7, 10 y 16; desde el traste 15 la extensión sobrepasa el traste 24, el último del mástil; y la extensión en milímetros, de 112,4 a 131,3 mm donde el mástil no la detiene.
  3. Confirmada: los grados de GTR-002 para las cinco formas; C en los trastes 0, 3, 5, 8 y 10, tres o cuatro trastes cada una, solo C, E y G; cada orden una rotación de C A G E D, y el de G el de Wikipedia; C en la cuerda 2 solo en la forma de C (traste 1) y la forma de D (traste 13), E, E y G en las formas de A, G y E. En el orden de GA, ninguna forma reconocida, y 001220, E2 A2 D♯3 A3 C♯4 E4, reconocido como «E-Shape»; invertida, la forma de E en los 13 trastes y nada más; la etiqueta e-shape, que no pasa la prueba de VoicingFilterEngine.
  4. Confirmada: ningún término de cejilla; los acordes abiertos de −0,63 (Em) a −0,06 (D), F 0,29, las formas de A, G y E en C 0,21, 0,24 y 0,24, la forma de D 0,59, la forma de E en el traste 12 0,66; el C abierto «Intermediate», Am, Em, E, G y D «Beginner»; la cejilla de VoicingPhysicalAnalyzer solo en x35553 y 875558; la de BiomechanicalAnalyzer en Em, E, G, F y las formas con cejilla, no en Am, C, D ni la forma de D en C; F, Em y E «Very Easy» con 0,92, el C abierto «Easy» con 0,82; los mismos resultados para los cuatro tamaños de mano, y para la HandSize y el MaxComfortableStretchMm de un perfil; la forma de D en C con 1,04 en Beginner() y 0,18 en Jazz(). No predicho: las puntuaciones no citadas arriba, como 6,90 para 875558 y 0,72 para la forma de D en C.
  5. Confirmada: las 15 entradas como en Instruments.yaml; la cuerda 2 bajada 11 semitonos en OpenCMajor y 10 en OpenAMajor, ninguna cuerda movida más de 2 en las otras nueve; OpenEMajorV2 un acorde de E menor; los cuatro órdenes de cuerdas de Wikipedia. Que el C# y el F# de GA nunca leen el archivo se comprobó buscando en el código en a826864, no ejecutándolo.
  6. Confirmada: Notes correcto en 41 de 41; el B♭ de Gsus4, el B de C5, C7 sin G; HasBarre en F, B♭, B, Bm y F5, más de cuatro notas pisadas en todos salvo F5; Fmaj7 para F y F5, B7 y B5 para B y Bm, nada para B♭; Fsus2 y C/F ausentes de la tabla. No predicho: B7 contiene todas las notas de B y B5 no; 133011 tiene cinco notas pisadas.

Observaciones, no pruebas:

  • PHYSICAL_PLAYABILITY_IMPROVEMENTS.md presenta sus distancias como la salida de FretDistance_SameFretSpan_DifferentPositions_ShouldHaveDifferentPhysicalDistances, una prueba de PhysicalFretboardCalculatorTests.cs, que el proyecto de pruebas de GA quita de la compilación (GA.Business.Core.Tests.csproj, línea 47). El mismo proyecto quita BiomechanicalAnalyzerTests.cs (línea 49), cuyas pruebas de tamaño de mano llaman a BiomechanicalAnalyzer.CreateForHandSize, un método que la clase no tiene. Leído, no ejecutado.
  • MusicalEmbeddingGenerator añade «-shape» al CagedShape en minúsculas (MusicalEmbeddingGenerator.cs, líneas 110-113), lo que daría e-shape-shape. Leído, no ejecutado.
  • La figura de GTR-002 “for key of E major” dibuja las formas sobre una escala de trastes 0, 3, 5, 7, 8, 10 y 12; el programa las encuentra en 0, 2, 4, 7 y 9.
  • El prototipo P7 del Laboratorio Guitar Alchemist encontró el C abierto «Intermediate» y ninguna cejilla en 133211 en el commit 66bdd04 de GA, como esta lección en a826864.

2026-10-02 — Lección 16: predicciones antes de la primera ejecución

Sección titulada «2026-10-02 — Lección 16: predicciones antes de la primera ejecución»

Escritas a partir del código de GA en a826864, una vez compilado el programa de la lección y antes de su primera ejecución; la entrada de resultados contrasta cada una con lo que imprimió el programa. Para esta lección no se llamó a ninguna herramienta MCP ni a ningún chatbot: el programa compila las dos habilidades del chatbot de GA y las llama directamente, con sustitutos para el registro y el extractor de consultas que reciben, y lee la herramienta MCP como texto para aplicarla. El curso forma el acorde de séptima de cada grado apilando terceras dentro de la escala, y toma los pares acorde-escala de los artículos «Chord-scale system» y «Jazz improvisation» de Wikipedia y la nota a evitar de su artículo «Avoid note».

  1. Arpegios y modos. Los acordes de séptima de C mayor son Cmaj7, Dm7, Em7, Fmaj7, G7, Am7 y Bm7♭5, y los de A menor los mismos siete desde Am7. Los sufijos de arpegio de las dos tablas de la herramienta (GuitaristProblemTools.cs, líneas 386-406) deberían coincidir con los catorce, y ImprovisationSkill.ArpeggioFor debería devolver el símbolo de cada acorde (ImprovisationSkill.cs, líneas 266-284). Las columnas Mode y Notes de las tablas deberían coincidir con el modo de cada grado, y también el MajorScaleMode de GA. De las doce escalas restantes que nombran la herramienta y las habilidades, el modo de GA en el mismo lugar de su clase debería reproducir diez. Las dos excepciones son los modos disminuidos de GA, como en la lección 12: el primero, que GA llama «Half-whole diminished», empieza por un tono, y el segundo es lo contrario, así que las dos filas deberían decir DIFF.
  2. ga_arpeggio_suggestions. La herramienta encuentra el grado solo por la fundamental del acorde (línea 463) y devuelve chord + arpeggioSuffix (línea 482): el símbolo entero, seguido del sufijo de la tabla. Para su propio ejemplo, Am F C G en C mayor, debería devolver «Amm7», «Fmaj7», «Cmaj7» y «G7», no el «Am7» de su descripción (línea 412). Para un ii–V–I escrito con séptimas debería devolver «Dm7m7», «G77» y «Cmaj7maj7». El modo viene del grado, no del acorde. En A mayor, A7, E7 y D7 deberían recibir el jónico, el mixolidio y el lidio, lo que deja el G de A7 y el C de D7 fuera del modo, donde el sistema acorde-escala de Wikipedia asocia el mixolidio a los tres. Un acorde de A mayor en C mayor debería recibir el eólico, cuyo C choca con el C♯ del acorde; las observaciones de ImprovisationSkill describen este caso (líneas 23-32). E7 en A menor debería recibir el frigio, que no tiene el G♯ del acorde. La segunda palabra de la tonalidad nombra el modo, y cualquier palabra que no sea «minor» vale mayor (líneas 428-430 y 450). Una tonalidad escrita «Am» debería leerse, por tanto, «Am major», es decir A mayor: Am recibe «Ammaj7» y el jónico, con C fuera, y Dm recibe «Dmmaj7» y el lidio, con F fuera. B♭ en C mayor es cromático: debería recibir «Bb (chromatic — outside key)», «depends on context» y las notas «R, M2, M3, P5» (líneas 464-475).
  3. ImprovisationSkill. InferQuality pasa el símbolo a minúsculas antes de compararlo (línea 323), así que CM7 debería leerse «minor 7»: arpegio Cm7, dórico primero, y E y B fuera de sus tres escalas. En los 31 símbolos sobre C, la primera escala ofrecida debería contener todas las notas del acorde salvo en siete símbolos. Son CM7; Cmaj7♯5, leído «major 7» porque la línea 340 va antes que la 343, con G♯ fuera tanto del jónico como del lidio; C7♯11, cuyo mixolidio no tiene el F♯ que tiene el lidio dominante; C7♭13 y C7+5, leídos «dominant 7», cuyo mixolidio no tiene el A♭ o el G♯ que tiene el mixolidio ♭6; y C7♭9 y C7♯9, leídos «altered dominant» con el arpegio «C7alt», donde la escala alterada no tiene el G del acorde y la escala disminuida semitono–tono contiene las cinco notas. Cadd9, Csus2, Csus4 y C5 deberían leerse «unknown» y recibir la escala mayor de la fundamental. C6 y C69 deberían leerse «major triad», arpegio C; Cm6 «minor major 7», arpegio CmMaj7; C7♯5 «augmented», arpegio Caug. CanHandle debería aceptar 16 de sus 17 consultas de ejemplo. Debería rechazar «what scales fit over the progression Cmaj7 A7 Dm7 G7» (línea 74), que no contiene ninguna de sus palabras clave como palabra entera: ahí «what scale» va seguido de una s (ChordIntentMatching.cs, líneas 22-35). En una serie de acordes, la habilidad lee cada símbolo por separado (líneas 196-261). Am F C G debería dar A eólico, y luego F, C y G jónico; F jónico tiene un B♭ y G jónico un F♯, notas que no tiene ninguno de los cuatro acordes. A7 E7 D7 debería dar tres veces el mixolidio, la respuesta de Wikipedia. El vamp dórico de GAA-003, Am7 D7, debería dar A dórico y D mixolidio. Su vamp mixolidio, A7 G/A, debería leerse como tres acordes, A7, G y A, con A jónico para el último.
  4. OutsideNotesSkill. Classify llama nota a evitar a una nota fuera del acorde cuando está un semitono por encima de una nota del acorde, y tensión en otro caso (líneas 141-189). Las notas a evitar deberían ser D♭, F y A♭ sobre Cmaj7, con D, E♭, F♯, A y B♭ como tensiones; D♭, F, A♭ y B, la séptima mayor, sobre C7; D♭, E, A♭ y B sobre Cm7; D♭, E, G y B sobre Cm7♭5. El comentario sobre los acordes de dominante nombra «the b9/#9/#11/b13 half-step clashes» (línea 164), pero sobre C7 D♯ (♯9) y F♯ (♯11) deberían ser tensiones, y F y B notas a evitar. Algunas tensiones no están en ninguna de las escalas que ImprovisationSkill ofrece para el mismo acorde: E♭ y B♭ sobre Cmaj7, E♭ sobre C7, F♯ sobre Cm7 y A sobre Cm7♭5. La habilidad debería responder a siete de sus diez consultas de ejemplo (líneas 48-63): F nota a evitar sobre Cmaj7, tres veces; A y F♯ tensiones sobre Cmaj7; F séptima menor de G7, aunque CanHandle rechaza esa consulta por falta de palabra clave; y B♭ sobre C major «an available tension — the b7 (minor seventh)», medido contra una tríada de C mayor. «why does that note clash over the chord» y «why does the b9 sound so tense over C7» deberían pasar CanHandle sin recibir respuesta, porque ninguna nota en mayúscula precede a «over»; la primera solo pasa porque el patrón de acorde ignora mayúsculas y minúsculas (línea 292) y lee «the chord» como un acorde de C. «why does the note clash over this chord» debería fallar en las dos.
  5. GAA-003 a través de Classify. La respuesta del módulo a su primera pregunta de autoevaluación dice que sobre Am7 ninguna nota de la pentatónica menor de A está a un semitono de una nota del acorde, y que sobre A7 C está un semitono por debajo del C♯ del acorde y D un semitono por encima. Sobre Am7, Classify debería estar de acuerdo: A, C, E y G son notas del acorde, y D una tensión (la 11). Sobre A7 solo debería ver la mitad de ese roce: D es una nota a evitar (la 11), pero C una tensión (♯9). Las notas que según el módulo apartan cada modo deberían ser todas notas a evitar: F en A dórico sobre Am7, la ♭13; G♯ en mixolidio sobre A7, la séptima mayor; D en lidio sobre Amaj7, la 11. Las terceras de A7, D7 y E7 sacadas de ChordVocabulary.GetFormula("dominant 7") (ChordVocabulary.cs, línea 121) deberían ser C♯, F♯ y G♯, los objetivos del módulo.
  6. Las entradas de improvisación de GA y la caja 1. ImprovisationConcepts.yaml contiene cuatro conceptos (líneas 6-14), cada uno con un nombre y una línea Concept, ninguno con Category. YamlKnowledgeLoader debería devolver cuatro entradas, con la categoría vacía y el nombre del archivo como única etiqueta (YamlKnowledgeLoader.fs, líneas 65-91). Su contenido debería ser el nombre seguido de «Concept: …», y ninguna asocia una escala a un acorde. La caja 1 de GAA-003 ocupa los trastes 5 y 8 de las cuerdas 6, 2 y 1 y los trastes 5 y 7 de las cuerdas 5, 4 y 3. Debería tocar A, C, D, E y G, las notas del quinto modo de la pentatónica mayor de GA, y los tres modos del módulo sobre A deberían coincidir con la grafía del curso.

2026-10-04 — Correcciones propuestas a Guitar Alchemist

Sección titulada «2026-10-04 — Correcciones propuestas a Guitar Alchemist»

Tres filas de la tabla QA volvieron a GA en la PR 810, y una en la PR 808, abiertas desde un clon aparte en main 75959835. Ninguna está fusionada todavía: GA deja la revisión y la fusión a alguien distinto del autor.

  • Scale.Tritone pasa a ser C D♭ E G♭ G B♭, las notas del acorde de Petrushka: 6 transposiciones, donde el conjunto antiguo, C D♭ E F♯ G A, tenía 12. Scales.yaml y ExtendedScales.yaml lo siguen, así que los catálogos dan el nombre “Tritone” al identificador binario 1235 en lugar del 723.

  • DiminishedScaleDegree llama al grado 1 “Whole-half diminished” y al grado 2 “Half-whole diminished”, según el primer paso de cada modo de Scale.Diminished.

  • IsSymmetricalSet compara también el paso de la última clase de altura a la primera: es verdadero para 16 de los 4096 conjuntos en lugar de 156, entre los que estaban las 66 díadas y C D E.

  • En la 808, SpecializedTunings.yaml es YAML válido. YamlKnowledgeLoader.LoadAllKnowledgeEntries(), llamado desde una aplicación basada en un archivo que referencia Common/GA.Business.Config/GA.Business.Config.fsproj, contado por archivo de origen:

    main 75959835
    [YamlKnowledgeLoader] Skipping SpecializedTunings.yaml: While parsing a flow sequence, did not find expected ',' or ']'.
    entries: 192
    #808 (e4ce3cc6)
    entries: 213
    SpecializedTunings: 21

    Los otros 15 archivos dan los mismos números en ambos. ChordProgressions.yaml y GuitarTechniques.yaml, que los cargadores C# tipados de GA no saben leer en main, dan ahí 36 y 10 entradas: este cargador lee cualquier YAML válido como objetos simples.

La fila sobre ChordFormula.GetSymbolSuffix (lección 13) ya estaba corregida aguas arriba cuando el curso la midió. El curso lee GA en a826864, un commit del 2026-09-14, y la PR 680, fusionada el 2026-09-17, añade el “maj”. "C" + Chord.FromSymbol(symbol).Formula.GetSymbolSuffix() da C9, C11 y C13 para Cmaj9, Cmaj11 y Cmaj13 en a826864, y el propio símbolo en el commit 86f81ab2 de la 680 y en main 75959835.

Otras once filas volvieron el mismo día en cuatro pull requests, abiertas desde el mismo clon y medidas antes y después en main 75959835. Cuando se escribió esta entrada, la CI de GA había pasado en la 818, la 819 y el primer commit de la 820, y corría en el segundo commit de la 820 y en la 823. Ninguna está fusionada todavía.

PR Filas QA Antes → después
818 Los vectores y las rotaciones de Modes.yaml, los nombres que YAML cortaba como comentarios, los nombres alternativos; la línea «Scale:» en parte Nombres cortados: 8 de 165 → 0; modos que conservan sus nombres alternativos: 0 → 79; vectores declarados que difieren de las notas de su familia: 2 de 18 → 1; miembros sin el vector de su primer modo: 26 de 134 → 22
819 Los voicings drop, los filtros drop, los shells Sobre los 313 047 voicings de la auditoría de voicings de GA, DropVoicing sigue la definición de Wikipedia en 225 338 → todos; sobre los 687 acordes de séptima en C de la lección 14: Drop2 264 → 111, Drop3 0 → 92, Drop2And4 0 → 143; shell-voicing en 57 981 voicings → en los 877 shells
820 ChordSymbolParser; CM7 en Chord.FromSymbol Cifrados de la lección 13 bien: 17 de 41 → 41; «Can» C mayor, «Give» G mayor → rechazados
823 GenerateAllPossibleChords 25 900 plantillas → 12 950, la primera mitad, en el mismo orden
  • El curso lee GA en a826864, y en main algunas filas ya se habían movido: 2 de los 18 vectores declarados diferían, no 9, y 26 miembros no tenían el vector de su primer modo, no 60.
  • Codex revisó la 818: las inversiones de la tríada aumentada se escribían C E G♯, como el estado fundamental. Ahora son C E A♭ y C F♭ A♭, escritas según sus intervalos sobre el bajo, como las demás inversiones.
  • La 820 rechaza lo que el parser no sabe leer. El chatbot, que lo prueba con un mensaje entero, ya no encuentra ningún acorde en «Cmaj7 jazz voicings», donde encontraba C mayor.
  • La revisión de Codex de la 820 señaló que el parser leía el bajo de un acorde con barra y luego lo perdía: C/E tenía C como Bass. Un segundo commit pone el bajo primero, así que C/E es E G C. La búsqueda de voicings de GaApi aún lo ignora, porque solo pasa las clases de altura.
  • El primer commit de la 823 quitaba también NaturalMinorMode, cuyos siete modos son los de la escala mayor, con los mismos nombres: sus 1 666 plantillas tienen las mismas notas y clases de altura que las de los modos mayores. Codex señaló que la escala madre de su modo difiere (A B C D E F G, no C D E F G A B) y que CreateTraditionalChordLibrary promete esos modos, así que un segundo commit los devuelve.
  • La fila sobre ChordAlterationService no fue a ninguna PR: solo ChordTemplateNamingService y HybridChordNamingService lo llaman, y ninguna aplicación, herramienta MCP ni camino del chatbot los llama en 75959835.

2026-10-07 — Lección 16: resultados frente a las predicciones

Sección titulada «2026-10-07 — Lección 16: resultados frente a las predicciones»

El programa es Lesson18.cs (punto de entrada l18), su salida expected/l18.txt; check.sh pasa para las lecciones 1 a 18 y los 23 diagramas. Codex escribió el programa y las predicciones el 2026-10-02, antes de que Program.cs tuviera una entrada para él; esta sesión retomó el trabajo, añadió la entrada y ejecutó el programa por primera vez el 2026-10-07. Compila tal cual cinco archivos de GA.Business.ML, las dos habilidades, el filtro por palabras clave, el vocabulario de acordes y la interfaz de las habilidades, y el atributo de GuitarAlchemist.Registry que llevan; StandIns.cs sustituye los cuatro tipos que toman de código con paquetes que el curso no compila: el logger, el registro de respuesta, el extractor de consultas por LLM y su consulta. Lee GuitaristProblemTools.cs como texto, como la lección 15. fetch-ga.sh añade ahora los seis archivos a su sparse checkout. La compilación no da ninguna advertencia nueva. No se llamó a ninguna herramienta MCP ni a ningún chatbot. Después de la primera ejecución se realinearon tres tablas, sin que cambiara ningún valor, y se añadió un bloque bajo un título que lo dice: la respuesta entera de OutsideNotesSkill para B sobre C7, y para E y B sobre CM7.

  1. Confirmado: los catorce sufijos y los catorce símbolos de ArpeggioFor; las columnas Mode y Notes de las dos tablas y MajorScaleMode; diez de las otras doce escalas, y los dos modos disminuidos DIFF.
  2. Confirmado: «Amm7», «Fmaj7», «Cmaj7» y «G7»; «Dm7m7», «G77» y «Cmaj7maj7»; jónico, mixolidio y lidio para A7, E7 y D7, con G y C fuera; eólico para A en C mayor, contra su C♯; frigio para E7 en A menor, sin su G♯; «Am major», con «Ammaj7» y C fuera, «Dmmaj7» y F fuera; B♭ cromático, con las tres cadenas fijas. No predicho: los arpegios «Am7» para el acorde de A mayor y «E7m7» para E7. Encontrado después de la ejecución: GA #626, fusionada el 2026-09-24, corrigió upstream el sufijo y el grado; en main c1416eee, la tonalidad se lee como antes. Leído, no ejecutado.
  3. Confirmado: CM7 «minor 7», arpegio Cm7, dórico primero, E y B fuera de las tres escalas; siete símbolos cuya primera escala no tiene una nota: CM7, Cmaj7♯5 (G♯, en ninguna de sus escalas), C7♯11 (Lydian Dominant lo contiene), C7♭13 y C7+5 (Mixolydian ♭6), C7♭9 y C7♯9 (Half-Whole Diminished); Cadd9, Csus2, Csus4 y C5 «unknown»; C6 y C69 «major triad», arpegio C; Cm6 «minor major 7», arpegio CmMaj7; C7♯5 «augmented», arpegio Caug; 16 de 17 ejemplos de petición, la petición de progresión rechazada; A eólico, y luego F, C y G jónico; tres veces mixolidio; A dórico y D mixolidio; A7, G y A, con A jónico. No predicho: la nota “careful on the IV chord” bajo C y G igual que bajo F. Encontrado leyendo el código después de la ejecución: los comentarios de ChordVocabulary describen la regresión de CM7.
  4. Confirmado: las notas a evitar y las tensiones de las cuatro columnas; las cinco tensiones en ninguna de las escalas de la habilidad; siete respuestas, F sobre G7 respondida aunque CanHandle la rechaza, B♭ medido contra una tríada de C mayor; dos peticiones que pasan CanHandle y reciben el texto de ayuda, una que falla en las dos. No predicho, añadido después de la ejecución: el consejo para B sobre C7, “exactly the kind of altered tension players reach for (major 7th on the V)”, y CM7 leído como séptima mayor por esta habilidad.
  5. Confirmado: sobre Am7, cuatro notas del acorde y D la 11; sobre A7, D nota a evitar y C la ♯9; F, G♯ y D notas a evitar, la ♭13, la séptima mayor y la 11; C♯, F♯ y G♯.
  6. Confirmado: cuatro entradas con categoría vacía, el nombre del archivo como única etiqueta, el nombre y luego «Concept: …»; la caja 1 A C D E G, «Minor pentatonic» de GA; los tres modos. No predicho: 192 entradas de 15 archivos, SpecializedTunings.yaml saltado como el 2026-10-04.

Observaciones, no pruebas:

  • Desde GA #626, ga_arpeggio_suggestions en main nombra los arpegios con ImprovisationSkill.InferQuality, así que la herramienta leería ahora también CM7 como séptima menor. Leído, no ejecutado.
  • La lección cita GAA-003 en Demerzel 0f7a5fd, el commit de la última sincronización de Streeling en el sitio.
  • Si el reconocedor completo de acordes de GA (no solo TryFindExact) nombra inversiones como 032010; la búsqueda de voicings por MCP sugiere que sí (C/E), pero el curso no lo llamó.
  • El commit del servidor MCP: las respuestas anteriores no se reprodujeron contra un servidor compilado desde a826864.
  • HarmonicFunctionAnalyzer.Parse con “Supertonic” y “Submediant”, mediante un test en GA.
  • Los radios y los ejes de simetría del BraceletNotation de GA, renderizados en un navegador.
  • domain.commonTones en un servidor compilado después de #681: la corrección se leyó en 5c3a52a, no se ejecutó.
  • Las respuestas del propio chatbot a «voice leading C major to G major» y a «voice leading from G to Cmaj7», en lugar de la reescritura de su regla por el curso.
  • Si una versión posterior de GA registra YamlKnowledgeSyncService y deja que un agente busque en la colección yaml_knowledge, de modo que las líneas incorrectas de ModalInterchange.yaml puedan llegar a una respuesta.
  • Las dos herramientas ga_chord_substitutions en marcha, la closure del servidor MCP y la herramienta del mismo nombre de GaApi, frente a los resultados de la lección 10.
  • get_borrowed_chords a través del servidor MCP y de GaApi, en lugar del servicio compilado solo.
  • get_mode_info y get_available_modes a través del servidor MCP en marcha, en lugar de ModesConfig solo: get_mode_info("Ionian Augmented") debería responder C D♯ E F G♯ A B.
  • Qué responde el ModesSkill del chatbot, que lee GetModalFamilies y conserva por tanto los nombres alternativos, para «Ionian Augmented», «Altered bb7» y «Lydian».
  • La línea «Scale:» del ga_chord_to_set en marcha para Cmaj7, G7 y Cm.
  • La respuesta del ModesSkill en marcha a «modes of limited transposition», en lugar de la reconstrucción de su formato por el curso.
  • La línea «Scale:» del ga_chord_to_set en marcha para el sexto modo de Messiaen, C D E F G♭ A♭ B♭ B: la búsqueda responde «Diminished (Half-Whole)».
  • Los acordes que GenerateFromSymmetricalScales construye a partir de los 20 modos, y los modos que ModalCharacteristicIntervalService pierde por sus índices solapados, ejecutándolos.
  • VoicingFilterService con «Cmi7» y el chatbot con “Can you analyze this progression: Dm7 G7 Cmaj7”, ejecutados en lugar de leídos.
  • El ga_polychord en marcha con B sobre C y C sobre F♯, frente a la copia de su código que hace el curso.
  • El reconocedor completo de acordes de GA, no solo TryFindExact, con los voicings x3233x, x32335 y x3234x.
  • El ga_search_voicings en marcha con «drop2», «shell» y «rootless»: qué voicings devuelve el índice para cada etiqueta.
  • La etiqueta «Shell» de AutoTaggingService sobre el corpus indexado, ejecutada en lugar de leída, y si una versión posterior de GA vuelve a compilar IndexVoicingsCommand, lo que haría alcanzables las etiquetas de drop de InterpretationService.
  • Lo que responde el chatbot cuando se le piden voicings drop 3, ya que GA no etiqueta ninguno.
  • El ga_easier_voicings en marcha sobre F, Bm y B♭, en lugar de la lectura de su filtro por el curso, y las pistas de sustitución que añade a partir de domain.chordSubstitutions.
  • Si una versión posterior de GA lee Tunings.toml, o deja que HarmonicNavigator3D use sus propiedades tunings y dataUrls.
  • ga_arpeggio_suggestions, ImprovisationSkill y OutsideNotesSkill en vivo, sobre las peticiones de la lección 16, en lugar de la herramienta leída como texto y las habilidades compiladas solas; y en main, si la herramienta, que ahora llama a InferQuality, lee CM7 como séptima menor.