60 lines
7.5 KiB
Markdown
60 lines
7.5 KiB
Markdown
# Active production path audit
|
|
|
|
Baseline: revision `405066e` (`Revamp`), initially clean working tree. The immutable copy is `build/composer_repair/405066e/baseline/`; `baseline_inputs.json` records source/data and optional-reference hashes. These are evidence, not production inputs. The named ZIP archives and external remediation/comparison Markdown files were absent. The extracted source copies in `data/songs/` remain authoritative and unchanged.
|
|
|
|
Optional reference paths actually present:
|
|
|
|
- `build/all-of-me-solo-1.xml` — acoustic
|
|
- `build/all-of-me-solo-2.xml` — electric
|
|
- `build/autumn-leaves-solo-1.xml` — acoustic
|
|
- `build/autumn-leaves-solo-2.xml` — electric
|
|
|
|
No reference contents were inspected to author the production changes. Optional comparison commands run after generation, preserve raw XML, and explicitly apply the separately confirmed guitar-written octave convention. Source import keeps its own contract.
|
|
|
|
| Reported issue | Reproduction / earliest failing stage | Repair |
|
|
|---|---|---|
|
|
| Broad score overwritten | Confirmed: `checked_phrase` score replaced in `themes.phrase_candidates`; selection | One `MusicalEvaluation` supplies the actual score; no subsequent replacement or extra chorus transition cost |
|
|
| Density calculated but unused | Confirmed in removed `phrasing.evaluate`; selection | Active-span attack-range contribution in authoritative evaluator; sustains and planned space have separate intents |
|
|
| Absolute onset “rhythm diversity” | Confirmed in `themes.seeds`; retrieval | Duration/rest descriptors invariant under time translation |
|
|
| Chord tone at every internal endpoint | Confirmed in `unit_candidates`; construction and validity | Ordinary endpoints use mapped pitches; sustained notes and declared destinations retain their contracts |
|
|
| Every window sustained/closed | Confirmed; representation/construction | Open alternative; local settles are intermediate; cadential completions and source handoffs are terminal |
|
|
| Answer vocabulary unreachable | Confirmed: operation chooser omitted answer; construction | Data-defined chooser requests answer, extension, fragment, free continuation, development and return |
|
|
| Residual third/sixth-beat offsets | Reproduced from half-beat edits of triplet material; construction | Complete group checks; binary-only boundary alteration; complete displaced triplets preserved |
|
|
| Expressions after strict winner | Confirmed in `composer.compose`; construction | Typed alternatives and direct versions compete before phrase selection |
|
|
| Narrow starting/route choices | Confirmed: three first pitches, prefix of two paths, suffix of three; pruning | Whole-route actions, register representatives, named cutoff counts; no independently selected suffix |
|
|
| Source register / electric +12 | Confirmed in role data and `profiles.for_part`; construction | Soft overlapping role centers and phrase alternatives, all six strings |
|
|
| Role dependency / reference lookup | Not reproduced in baseline normal path | Existing independent process workers retained; runtime read boundary added |
|
|
| Overly full responsive accompaniment | Not reproduced in current production | Current source-only canonical sparse comping retained; no generated-solo response reintroduced |
|
|
|
|
## Before and after call graph
|
|
|
|
Both enter through `generator.__main__ → arrange.generate.generate_performance_scores → production.generate_tree → generate_role`. A spawn process pool already existed (default two workers). Roles use immutable original-song analysis and independently keyed policies/caches. Assembly applies source-defined role masks.
|
|
|
|
Previously the solo path was `composer.compose → leads.thematic_options → themes.phrase_candidates → unit_candidates → protected prefix + route suffix → checked_phrase → overwritten score → solo winner → expressions.refine`.
|
|
|
|
Now it is `composer.compose → leads.thematic_options → themes.phrase_candidates → whole joint unit_candidates → complete routes → provisional two-sided join alternatives / typed expression alternatives → checked_phrase → scoring.musical → phrase frontier → independent solo winner → validation → notation → assembly`. Source masks, vocal pickup, scales and physical checks are retained.
|
|
|
|
| Module/function | Live responsibility | Production inputs / budgets |
|
|
|---|---|---|
|
|
| `production.SourceAnalysis.read` | Canonical melody, harmony, exact meter/tempo/form | Original source only; corrected `meter` key to actual `time_signature` |
|
|
| `themes.seeds` | Source feature evidence throughout the head | Source notes, preferred feature roles; eight diverse seeds |
|
|
| `themes.rhythm_windows` / `patterns` | Complete rhythm alternatives and lawful transformations | Meter-filtered catalog, authored cells and difficulty; eight representatives |
|
|
| `themes.operation_choices` | Request development purposes | `grammar.operations`, actual home/incoming state |
|
|
| `themes.unit_candidates` | Complete joint actions | Actual incoming note, theme, destination, register; 16 jobs, eight retained gestures, deterministic retry |
|
|
| `routes.candidates` | Full octave-aware scale/chord route | Relative sequence catalog, chord traversal operators, exact sounding span; eight route representatives |
|
|
| `gesture_rhythm.join_variants` | Bounded edits across internal joins | Up to two beats on each side; eight legal alternatives; no protected hold consumed |
|
|
| `expressions.joint_candidates` | Approach/color/anticipation/suspension alternatives | Versioned rules; eight representatives per provisional phrase, with direct version retained |
|
|
| `realization.checked_phrase` | Identity, harmony, hold, placement, final evaluation | No optional reference inputs; one final evaluation result |
|
|
| `leads.thematic_options` | Bounded continuation across windows | Eight chorus alternatives; duration-weighted complete evaluations |
|
|
| `comping.Canonical` | Source-only reusable accompaniment | Written harmony/source rhythm/form, sparse voicing and comping resources |
|
|
|
|
`themes.prefix_paths`, `_prefix_paths`, and unused `instantiate` were removed. The old thematic `phrasing.evaluate` was removed. The generic cell/draft realizer and explicit `mode='paraphrase'` API remain compatibility/test/audition paths; ordinary production does not call them or silently fall back to them. Their existence is not claimed as a new production capability.
|
|
|
|
A further pruning defect appeared during the real-song build: the seed category combined treatment and form position. Its first layer could fill the entire budget with eight exact-interval references and discard rhythm/contour contracts. The corrected cutoff preserves treatment families first; a synthetic reachability regression covers this. Open windows now also request continuing rhythm, rather than using arrival rhythm simply because a computational window ends.
|
|
|
|
Profiling found repeated `diverse` ranking and interval-family classification among the major costs. Ranking is now decorated once per item and immutable path descriptors are memoized. A stable-order comparison test proves that the optimized cutoff preserves the old ordering for tied ranks; no larger beam or wall-clock-dependent choice was added.
|
|
|
|
## Baseline export correspondence
|
|
|
|
A fresh read of each preserved MusicXML export was compared with `playback.compile_timeline` of its saved role document (explicit guitar octave convention and merged sounding ties). All four matched exactly: All of Me acoustic 117 attacks, electric 121; Autumn Leaves acoustic 83, electric 110. Evidence is `baseline-export-proof.json`. This confirms the saved baseline's exported music; it is not a claim that XML formatting or those counts predict musical quality.
|