Compare commits

...

4 Commits

Author SHA1 Message Date
Nathan Schneider
dd5f71e7ad Added user feedback to bicorder spec 2025-11-22 12:59:48 -05:00
Nathan Schneider
998c93b3f9 Legacy bicorder version added to analysis folder 2025-11-21 19:35:24 -07:00
Nathan Schneider
fa527bd1f1 Initial analysis 2025-11-21 19:34:33 -07:00
Nathan Schneider
7ba4a069a2 Removed extra whitespace from ascii_bicorder.py script 2025-11-21 19:32:47 -07:00
12 changed files with 357 additions and 76 deletions

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
tmp
analysis/venv
.aider*

View File

@@ -46,6 +46,8 @@ The result was a CSV-formatted list of protocols (`protocols_edited.csv`, n=411)
### Initial diagnostic
This diagnostic used the file now at `bicorder_analyzed.json`, though the scripts are set up to analyze `../bicorder.json`. That file has since been updated based on this analysis.
For each row in the dataset, and on each gradient, a series of scripts prompts the LLM to apply each gradient to the protocol. The outputs are then added to a CSV output file.
The result was a CSV-formatted list of protocols (`diagnostic_output.csv`, n=411).

0
analysis/bicorder_analyze.py Normal file → Executable file
View File

View File

@@ -0,0 +1,241 @@
{
"name": "Protocol Bicorder",
"schema": "bicorder.schema.json",
"version": "1.0.0",
"description": "A diagnostic tool for the study of protocols",
"author": "Nathan Schneider",
"date_modified": "YYYY-MM-DD",
"metadata": {
"protocol": null,
"analyst": null,
"standpoint": null,
"timestamp": null
},
"diagnostic": [
{
"set_name": "Design",
"set_description": "How the protocol is created and remembered",
"gradients": [
{
"term_left": "explicit",
"term_left_description": "The design is stated explicitly somewhere that is accessible to participants",
"term_right": "implicit",
"term_right_description": "The design is not stated explicitly but is learned by participants in another way",
"value": null,
"citation": null
},
{
"term_left": "precise",
"term_left_description": "The design is specified with a high level of precision that eliminates ambiguity in implementation",
"term_right": "interpretive",
"term_right_description": "The design is ambiguous, allowing participants a wide range of interpretation",
"value": null,
"citation": null
},
{
"term_left": "elite",
"term_left_description": "Design occurs through processes that involve powerful institutions and widespread recognition as normative",
"term_right": "vernacular",
"term_right_description": "Design occurs through evolving, peer-to-peer community interactions in order to suit participant-defined goals",
"value": null,
"citation": null
},
{
"term_left": "documenting",
"term_left_description": "The primary purpose is to document or validate activity that is occurring",
"term_right": "enabling",
"term_right_description": "The primary purpose is to enable activity that might not happen otherwise",
"value": null,
"citation": null
},
{
"term_left": "static",
"term_left_description": "Designed to be as fixed and unchanging as possible",
"term_right": "malleable",
"term_right_description": "Designed to be changed by participants according to evolving needs",
"value": null,
"citation": null
},
{
"term_left": "technical",
"term_left_description": "Primarily concerned with interactions among technologies",
"term_right": "social",
"term_right_description": "Primarily concerned with interactions among people or groups",
"value": null,
"citation": null
},
{
"term_left": "universal",
"term_left_description": "Addressed to a global audience",
"term_right": "particular",
"term_right_description": "Addressed to a specific community",
"value": null,
"citation": null
},
{
"term_left": "durable",
"term_left_description": "Designed to be persistently available",
"term_right": "ephemeral",
"term_right_description": "Designed to vanish when no longer needed",
"value": null,
"citation": null
}
]
},
{
"set_name": "Entanglement",
"set_description": "How the protocol relates with participant agents",
"gradients": [
{
"term_left": "macro",
"term_left_description": "Operates at large scales involving many participants or broad scope",
"term_right": "micro",
"term_right_description": "Operates at small scales with few participants or narrow scope",
"value": null,
"citation": null
},
{
"term_left": "sovereign",
"term_left_description": "A distinctive operating logic, not subject to any other entity",
"term_right": "subsidiary",
"term_right_description": "An operating logic under the control of a particular entity",
"value": null,
"citation": null
},
{
"term_left": "self-enforcing",
"term_left_description": "Rules are automatically enforced through its own mechanisms",
"term_right": "enforced",
"term_right_description": "Rules require external enforcement by authorities or institutions",
"value": null,
"citation": null
},
{
"term_left": "abstract",
"term_left_description": "Participants learn the protocol by studying it intellectually",
"term_right": "embodied",
"term_right_description": "Participants learn the protocol by physically practicing it",
"value": null,
"citation": null
},
{
"term_left": "obligatory",
"term_left_description": "Participation is compulsory for a certain class of agents",
"term_right": "voluntary",
"term_right_description": "Participation in the protocol is optional and not coerced",
"value": null,
"citation": null
},
{
"term_left": "flocking",
"term_left_description": "Coordination occurs through centralized direction or direct mimicry",
"term_right": "swarming",
"term_right_description": "Coordination occurs through distributed interactions without central direction",
"value": null,
"citation": null
},
{
"term_left": "defensible",
"term_left_description": "Strong boundaries and protections against external influence",
"term_right": "exposed",
"term_right_description": "Weak boundaries and vulnerable to external influence",
"value": null,
"citation": null
},
{
"term_left": "exclusive",
"term_left_description": "Excludes the use of other protocols that might be available to adopt",
"term_right": "non-exclusive",
"term_right_description": "Does not exclude the use of any other protocols",
"value": null,
"citation": null
}
]
},
{
"set_name": "Experience",
"set_description": "How the protocol is perceived in the context of its implementation",
"gradients": [
{
"term_left": "sufficient",
"term_left_description": "Adequately meets the needs and goals of participants",
"term_right": "insufficient",
"term_right_description": "Does not, on its own, adequately meet the needs and goals of participants",
"value": null,
"citation": null
},
{
"term_left": "crystallized",
"term_left_description": "Content and meaning are settled and widely agreed upon",
"term_right": "contested",
"term_right_description": "Content and meaning are disputed or under debate",
"value": null,
"citation": null
},
{
"term_left": "trust-evading",
"term_left_description": "Minimizes the need for trust among participants",
"term_right": "trust-inducing",
"term_right_description": "Relies on or cultivates trust among participants",
"value": null,
"citation": null
},
{
"term_left": "predictable",
"term_left_description": "Produces expected and consistent outcomes",
"term_right": "emergent",
"term_right_description": "Produces unexpected or novel outcomes",
"value": null,
"citation": null
},
{
"term_left": "exclusion",
"term_left_description": "The protocol creates barriers or excludes certain participants",
"term_right": "inclusion",
"term_right_description": "The protocol reduces barriers and includes diverse participants",
"value": null,
"citation": null
},
{
"term_left": "Kafka",
"term_left_description": "Fosters experiences of absurd complexity, alienation, and powerlessness",
"term_right": "Whitehead",
"term_right_description": "Enables participants to carry out desired activities with less work or thought",
"value": null,
"citation": null
},
{
"term_left": "dead",
"term_left_description": "Not actively utilized by relevant participants",
"term_right": "alive",
"term_right_description": "Actively utilized by relevant participants",
"value": null,
"citation": null
}
]
}
],
"analysis": [
{
"term_left": "hardness",
"term_left_description": "The protocol tends toward properties characterized by hardness",
"term_right": "softness",
"term_right_description": "The protocol tends toward properties characterized by softness",
"instructions": "Take all the 'value' fields in the gradients above and determine a mean. Round it to the nearest integer. That is the 'value' here.",
"value": null,
"citation": null
},
{
"term_left": "polarized",
"term_left_description": "The analyst tended toward more extreme high or low readings",
"term_right": "centrist",
"term_right_description": "The analyst tended toward readings at the middle of the gradients",
"instructions": "Take all the 'value' fields in the gradients above. Assess their degree of polarization. For instance, if all the values are either 1 or 9, the output would be 1, and if all of them are 5, the output would be 9.",
"value": null,
"citation": null
}
]
}

0
analysis/bicorder_batch.py Normal file → Executable file
View File

0
analysis/bicorder_init.py Normal file → Executable file
View File

0
analysis/bicorder_query.py Normal file → Executable file
View File

0
analysis/chunk.sh Executable file → Normal file
View File

0
analysis/multivariate_analysis.py Normal file → Executable file
View File

View File

@@ -8,7 +8,7 @@ import argparse
import sys
def center_text(text, width=80):
def center_text(text, width):
"""Center text within a given width"""
return text.center(width)
@@ -31,7 +31,7 @@ def format_gradient_bar(value):
return "[" + "".join(bars) + "]"
def format_gradient_line(term_left, term_right, value, left_width=18, right_width=18):
def format_gradient_line(term_left, term_right, value, left_width, right_width, center_width):
"""
Format a gradient line with proper spacing.
Example: " explicit < [|||||||||] > implicit "
@@ -39,7 +39,7 @@ def format_gradient_line(term_left, term_right, value, left_width=18, right_widt
bar = format_gradient_bar(value)
# Right-align the left term, add the bar, then left-align the right term
line = f"{term_left.rjust(left_width)} < {bar} > {term_right.ljust(right_width)}"
return center_text(line)
return center_text(line, center_width)
def format_metadata_field(field_value, field_name):
@@ -74,41 +74,65 @@ def generate_bicorder_text(json_data):
max_left_width = max(max_left_width, len(term_left))
max_right_width = max(max_right_width, len(term_right))
# Calculate the width needed for centering
# Gradient line format: "{left_term} < [|||||||||] > {right_term}"
# That's: max_left_width + 3 + 11 + 3 + max_right_width
gradient_line_width = max_left_width + max_right_width + 17
# Also check metadata and headers
metadata = json_data.get("metadata", {})
max_text_width = max(
len("Protocol"),
len("BICORDER"),
len(format_metadata_field(metadata.get("protocol"), "Protocol")),
len(format_metadata_field(metadata.get("analyst"), "Analyst")),
len(format_metadata_field(metadata.get("standpoint"), "Standpoint")),
len(format_metadata_field(metadata.get("timestamp"), "Timestamp")),
len("ANALYSIS")
)
# Check diagnostic set names
for diagnostic_set in json_data.get("diagnostic", []):
set_name = diagnostic_set.get("set_name", "").upper()
max_text_width = max(max_text_width, len(set_name))
# Use the maximum of gradient line width and text width
center_width = max(gradient_line_width, max_text_width)
# Header
lines.append(center_text("Protocol"))
lines.append(center_text("BICORDER"))
lines.append(center_text("Protocol", center_width))
lines.append(center_text("BICORDER", center_width))
lines.append("")
# Metadata section
metadata = json_data.get("metadata", {})
lines.append(center_text(format_metadata_field(metadata.get("protocol"), "Protocol")))
lines.append(center_text(format_metadata_field(metadata.get("analyst"), "Analyst")))
lines.append(center_text(format_metadata_field(metadata.get("standpoint"), "Standpoint")))
lines.append(center_text(format_metadata_field(metadata.get("timestamp"), "Timestamp")))
lines.append(center_text(format_metadata_field(metadata.get("protocol"), "Protocol"), center_width))
lines.append(center_text(format_metadata_field(metadata.get("analyst"), "Analyst"), center_width))
lines.append(center_text(format_metadata_field(metadata.get("standpoint"), "Standpoint"), center_width))
lines.append(center_text(format_metadata_field(metadata.get("timestamp"), "Timestamp"), center_width))
lines.append("")
# Diagnostic sections
for diagnostic_set in json_data.get("diagnostic", []):
set_name = diagnostic_set.get("set_name", "").upper()
lines.append(center_text(set_name))
lines.append(center_text(set_name, center_width))
for gradient in diagnostic_set.get("gradients", []):
term_left = gradient.get("term_left", "")
term_right = gradient.get("term_right", "")
value = gradient.get("value")
lines.append(format_gradient_line(term_left, term_right, value, max_left_width, max_right_width))
lines.append(format_gradient_line(term_left, term_right, value, max_left_width, max_right_width, center_width))
lines.append("")
# Analysis section
lines.append(center_text("ANALYSIS"))
lines.append(center_text("ANALYSIS", center_width))
for analysis_item in json_data.get("analysis", []):
term_left = analysis_item.get("term_left", "")
term_right = analysis_item.get("term_right", "")
value = analysis_item.get("value")
lines.append(format_gradient_line(term_left, term_right, value, max_left_width, max_right_width))
lines.append(format_gradient_line(term_left, term_right, value, max_left_width, max_right_width, center_width))
lines.append("")

View File

@@ -1,10 +1,10 @@
{
"name": "Protocol Bicorder",
"schema": "bicorder.schema.json",
"version": "1.0.0",
"version": "1.1.0",
"description": "A diagnostic tool for the study of protocols",
"author": "Nathan Schneider",
"date_modified": "YYYY-MM-DD",
"date_modified": "2025-11-21",
"metadata": {
"protocol": null,
@@ -24,7 +24,7 @@
"term_right": "implicit",
"term_right_description": "The design is not stated explicitly but is learned by participants in another way",
"value": null,
"citation": null
"notes": null
},
{
"term_left": "precise",
@@ -32,15 +32,15 @@
"term_right": "interpretive",
"term_right_description": "The design is ambiguous, allowing participants a wide range of interpretation",
"value": null,
"citation": null
"notes": null
},
{
"term_left": "elite",
"term_left": "institutional",
"term_left_description": "Design occurs through processes that involve powerful institutions and widespread recognition as normative",
"term_right": "vernacular",
"term_right_description": "Design occurs through evolving, peer-to-peer community interactions in order to suit participant-defined goals",
"value": null,
"citation": null
"notes": null
},
{
"term_left": "documenting",
@@ -48,7 +48,7 @@
"term_right": "enabling",
"term_right_description": "The primary purpose is to enable activity that might not happen otherwise",
"value": null,
"citation": null
"notes": null
},
{
"term_left": "static",
@@ -56,7 +56,7 @@
"term_right": "malleable",
"term_right_description": "Designed to be changed by participants according to evolving needs",
"value": null,
"citation": null
"notes": null
},
{
"term_left": "technical",
@@ -64,7 +64,7 @@
"term_right": "social",
"term_right_description": "Primarily concerned with interactions among people or groups",
"value": null,
"citation": null
"notes": null
},
{
"term_left": "universal",
@@ -72,7 +72,7 @@
"term_right": "particular",
"term_right_description": "Addressed to a specific community",
"value": null,
"citation": null
"notes": null
},
{
"term_left": "durable",
@@ -80,7 +80,7 @@
"term_right": "ephemeral",
"term_right_description": "Designed to vanish when no longer needed",
"value": null,
"citation": null
"notes": null
}
]
},
@@ -94,7 +94,7 @@
"term_right": "micro",
"term_right_description": "Operates at small scales with few participants or narrow scope",
"value": null,
"citation": null
"notes": null
},
{
"term_left": "sovereign",
@@ -102,7 +102,7 @@
"term_right": "subsidiary",
"term_right_description": "An operating logic under the control of a particular entity",
"value": null,
"citation": null
"notes": null
},
{
"term_left": "self-enforcing",
@@ -110,7 +110,7 @@
"term_right": "enforced",
"term_right_description": "Rules require external enforcement by authorities or institutions",
"value": null,
"citation": null
"notes": null
},
{
"term_left": "abstract",
@@ -118,7 +118,7 @@
"term_right": "embodied",
"term_right_description": "Participants learn the protocol by physically practicing it",
"value": null,
"citation": null
"notes": null
},
{
"term_left": "obligatory",
@@ -126,7 +126,7 @@
"term_right": "voluntary",
"term_right_description": "Participation in the protocol is optional and not coerced",
"value": null,
"citation": null
"notes": null
},
{
"term_left": "flocking",
@@ -134,7 +134,7 @@
"term_right": "swarming",
"term_right_description": "Coordination occurs through distributed interactions without central direction",
"value": null,
"citation": null
"notes": null
},
{
"term_left": "defensible",
@@ -142,7 +142,7 @@
"term_right": "exposed",
"term_right_description": "Weak boundaries and vulnerable to external influence",
"value": null,
"citation": null
"notes": null
},
{
"term_left": "exclusive",
@@ -150,7 +150,7 @@
"term_right": "non-exclusive",
"term_right_description": "Does not exclude the use of any other protocols",
"value": null,
"citation": null
"notes": null
}
]
},
@@ -164,7 +164,7 @@
"term_right": "insufficient",
"term_right_description": "Does not, on its own, adequately meet the needs and goals of participants",
"value": null,
"citation": null
"notes": null
},
{
"term_left": "crystallized",
@@ -172,7 +172,7 @@
"term_right": "contested",
"term_right_description": "Content and meaning are disputed or under debate",
"value": null,
"citation": null
"notes": null
},
{
"term_left": "trust-evading",
@@ -180,7 +180,7 @@
"term_right": "trust-inducing",
"term_right_description": "Relies on or cultivates trust among participants",
"value": null,
"citation": null
"notes": null
},
{
"term_left": "predictable",
@@ -188,7 +188,7 @@
"term_right": "emergent",
"term_right_description": "Produces unexpected or novel outcomes",
"value": null,
"citation": null
"notes": null
},
{
"term_left": "exclusion",
@@ -196,7 +196,7 @@
"term_right": "inclusion",
"term_right_description": "The protocol reduces barriers and includes diverse participants",
"value": null,
"citation": null
"notes": null
},
{
"term_left": "Kafka",
@@ -204,7 +204,7 @@
"term_right": "Whitehead",
"term_right_description": "Enables participants to carry out desired activities with less work or thought",
"value": null,
"citation": null
"notes": null
},
{
"term_left": "dead",
@@ -212,7 +212,7 @@
"term_right": "alive",
"term_right_description": "Actively utilized by relevant participants",
"value": null,
"citation": null
"notes": null
}
]
}
@@ -225,8 +225,9 @@
"term_right": "softness",
"term_right_description": "The protocol tends toward properties characterized by softness",
"instructions": "Take all the 'value' fields in the gradients above and determine a mean. Round it to the nearest integer. That is the 'value' here.",
"automated": true,
"value": null,
"citation": null
"notes": null
},
{
"term_left": "polarized",
@@ -234,8 +235,19 @@
"term_right": "centrist",
"term_right_description": "The analyst tended toward readings at the middle of the gradients",
"instructions": "Take all the 'value' fields in the gradients above. Assess their degree of polarization. For instance, if all the values are either 1 or 9, the output would be 1, and if all of them are 5, the output would be 9.",
"automated": true,
"value": null,
"citation": null
"notes": null
},
{
"term_left": "not useful",
"term_left_description": "The bicorder was not useful or relevant for analyzing this protocol",
"term_right": "very useful",
"term_right_description": "The bicorder was very useful and relevant for analyzing this protocol",
"instructions": "Evaluate the usefulness of this bicorder as a tool for analyzing this protocol, considering whether the gradient terms seemed revealing or irrelevant.",
"automated": false,
"value": null,
"notes": null
}
]
}

View File

@@ -20,10 +20,11 @@
macro < [|||||||||] > micro
sovereign < [|||||||||] > subsidiary
self-enforcing < [|||||||||] > enforced
analyzed < [|||||||||] > embodied
abstract < [|||||||||] > embodied
obligatory < [|||||||||] > voluntary
flocking < [|||||||||] > swarming
defensible < [|||||||||] > exposed
exclusive < [|||||||||] > non-exclusive
EXPERIENCE
sufficient < [|||||||||] > insufficient