Derive classifier dimensions from bicorder.json automatically

Both export_model_for_js.py and bicorder_classifier.py now read
DIMENSIONS and KEY_DIMENSIONS directly from bicorder.json at runtime,
so the model stays in sync whenever gradient terms are renamed or
added. A COLUMN_RENAMES dict handles historical CSV column name
changes. The model now includes bicorder_version so the app's version
check works correctly.

Regenerated bicorder_model.json against bicorder.json v1.2.6 with
correct dimension names, 9 key dimensions from shortform flags, and
updated thresholds.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Nathan Schneider
2026-03-20 15:13:54 -06:00
parent 5232e760be
commit f1ae9cac1f
3 changed files with 108 additions and 97 deletions

View File

@@ -1,10 +1,11 @@
{
"version": "1.0",
"generated": "2025-12-19T11:46:23.367069",
"bicorder_version": "1.2.6",
"generated": "2026-03-20T15:08:23.160614",
"dimensions": [
"Design_explicit_vs_implicit",
"Design_precise_vs_interpretive",
"Design_elite_vs_vernacular",
"Design_institutional_vs_vernacular",
"Design_documenting_vs_enabling",
"Design_static_vs_malleable",
"Design_technical_vs_social",
@@ -17,24 +18,25 @@
"Entanglement_obligatory_vs_voluntary",
"Entanglement_flocking_vs_swarming",
"Entanglement_defensible_vs_exposed",
"Entanglement_exclusive_vs_non-exclusive",
"Experience_sufficient_vs_insufficient",
"Entanglement_monopolistic_vs_pluralistic",
"Experience_sufficient_vs_limited",
"Experience_crystallized_vs_contested",
"Experience_trust-evading_vs_trust-inducing",
"Experience_predictable_vs_emergent",
"Experience_exclusion_vs_inclusion",
"Experience_Kafka_vs_Whitehead",
"Experience_restraining_vs_liberating",
"Experience_dead_vs_alive"
],
"key_dimensions": [
"Design_elite_vs_vernacular",
"Entanglement_flocking_vs_swarming",
"Design_precise_vs_interpretive",
"Design_institutional_vs_vernacular",
"Design_static_vs_malleable",
"Entanglement_obligatory_vs_voluntary",
"Entanglement_self-enforcing_vs_enforced",
"Design_explicit_vs_implicit",
"Entanglement_sovereign_vs_subsidiary",
"Design_technical_vs_social"
"Entanglement_self-enforcing_vs_enforced",
"Entanglement_obligatory_vs_voluntary",
"Entanglement_flocking_vs_swarming",
"Experience_predictable_vs_emergent",
"Experience_exclusion_vs_inclusion"
],
"cluster_names": {
"1": "Relational/Cultural",
@@ -229,14 +231,13 @@
]
},
"thresholds": {
"confidence_low": 0.5,
"confidence_low": 0.6,
"completeness_low": 0.5,
"boundary_distance_low": 0.3
"boundary_distance_low": 0.5
},
"metadata": {
"total_protocols": 406,
"cluster_1_count": 216,
"cluster_2_count": 190
},
"bicorder_version": "1.2.3"
}
}