docs/contracts/config.schema.json defines one pairList and both include_cRQA and include_crosswavelet $ref it. Its own description says:
Either explicit pairs [[a,b],[a,c]], or a legacy flat list [a,b,c] which is expanded to all combinations. Both forms are supported; prefer pairs.
Cross-wavelet honours that. Cross-RQA does not: it skips every entry that is not a two-element list, finds no valid pairs, prints a warning and returns without writing a file. So a config that validates against the contract produces a cross-RQA tab with no data, and the only clue is a line in the build log.
Where
packages/dims-analysis/dims_analysis/steps/crqa.py — valid_pairs()
packages/dims-analysis/dims_analysis/steps/crosswavelet.py — the expansion, around the base_pairs construction
docs/contracts/config.schema.json:13-34 — the shared pairList
- Already documented as a trap in
docs/analyses/index.md, which is not the same as fixing it
What to do
Pick one and make all of it true. Either expand the flat form in crqa.py as cross-wavelet does — the combination logic is four lines and could be shared — or drop the legacy form everywhere: from both steps, from apps/builder/dims_builder/validate.py, from packages/dims-tabs/crosswavelet.js, and from the schema.
Expanding is the smaller change and keeps existing study configs working. Dropping is defensible too, but it is a breaking config change and needs a release note.
Acceptance
"include_cRQA": ["a", "b", "c"] either produces three pairs or is refused with a message naming the fix. It does not silently produce nothing.
- Whatever is decided, the schema, both steps, the wizard's validator and the tab gate agree.
- A test in
packages/dims-analysis/tests/ covers the flat form for both keys.
- The gotcha paragraph in
docs/analyses/index.md is updated or removed.
🤖 Generated with Claude Code
docs/contracts/config.schema.jsondefines onepairListand bothinclude_cRQAandinclude_crosswavelet$refit. Its own description says:Cross-wavelet honours that. Cross-RQA does not: it skips every entry that is not a two-element list, finds no valid pairs, prints a warning and returns without writing a file. So a config that validates against the contract produces a cross-RQA tab with no data, and the only clue is a line in the build log.
Where
packages/dims-analysis/dims_analysis/steps/crqa.py—valid_pairs()packages/dims-analysis/dims_analysis/steps/crosswavelet.py— the expansion, around thebase_pairsconstructiondocs/contracts/config.schema.json:13-34— the sharedpairListdocs/analyses/index.md, which is not the same as fixing itWhat to do
Pick one and make all of it true. Either expand the flat form in
crqa.pyas cross-wavelet does — the combination logic is four lines and could be shared — or drop the legacy form everywhere: from both steps, fromapps/builder/dims_builder/validate.py, frompackages/dims-tabs/crosswavelet.js, and from the schema.Expanding is the smaller change and keeps existing study configs working. Dropping is defensible too, but it is a breaking config change and needs a release note.
Acceptance
"include_cRQA": ["a", "b", "c"]either produces three pairs or is refused with a message naming the fix. It does not silently produce nothing.packages/dims-analysis/tests/covers the flat form for both keys.docs/analyses/index.mdis updated or removed.🤖 Generated with Claude Code