You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
New subpackage bead.config.compose replaces the hand-rolled config
loader. Generic over any dx.Model schema; supports the full
OmegaConf interpolation grammar (${section.field}, ${.x} / ${..x} relative, ${a.b[0]} and ${a.b.0} list indexing, ${a.${b}} nested, \${literal} escape, cycle detection).
Bead-specific resolvers in bead.config.resolvers: ${bead.path:rel} joins against the active root's paths.data_dir; ${bead.anchor:name[,attr]} post-validation
expansion.
defaults: [...] composition at the top of any YAML/TOML config
composes referenced files left-to-right before the primary body.
Strict-merge rejects unknown keys with the dotted path to the
offending site, walking nested dx.Embed[T] models from __field_specs__.
TOML configs (.toml) supported alongside YAML out of the box.
bead.config.load_config is now a thin wrapper around compose(schema=BeadConfig, ...). The previous load_yaml_file / merge_configs helpers are removed.
CLI: every bead ... invocation accepts repeatable --set KEY=VALUE overrides threaded into the compose pipeline.
ScaleType.FORCED_CHOICE
New ScaleType.FORCED_CHOICE variant covers N-alternative
forced-choice tasks where per-item options vary across items
(response space is a fixed positional label set, e.g. ("first", "second"), but each Item carries its own
alternatives). family_to_item_template and the
active-learning model registry route forced-choice anchors to ForcedChoiceModel.
AnchorSpec.scale_type is an optional explicit override so config
files declare the task type alongside the response space.
New protocol.py module exposes build_protocol() / acceptability_family() / acceptability_anchor(). The 2AFC
acceptability question is declared once in config.yaml under protocol: and consumed by every script.
generate_deployment.py and simulate_pipeline.py build their ItemTemplate via family_to_item_template instead of literal
prompt strings.
create_2afc_pairs.py threads the protocol anchor name
("acceptability") into every pair's item_metadata so the
JATOS-result → AnnotationRecord bridge can match responses
back to the canonical anchor.
make validate-protocol builds the live AnnotationProtocol
from config.yaml and prints the family, prompt, and scale
type. Wired in as a prerequisite to make data.
tests/test_protocol.py covers the config-to-protocol round
trip, the forced-choice scale type, the family_to_item_template
prompt agreement, and the active-learning model selection for
the resulting encoding.